题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
输入
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=50)。
输出
对应每个测试案例,
输出该青蛙跳上一个n级的台阶总共有多少种跳法。
样例输入
6
样例输出
32
解题思路
假设要求的跳上n级台阶有多少种方法为f(n),由于青蛙可跳1~n步,若最后一步跳1级台阶,即跳完n - 1级后跳这一级台阶即可,有f(n-1)种跳法;若最后一步跳2级台阶,级跳完n - 2级后跳这2级台阶,有f(n-2)种跳法;同理,最后一步跳3级台阶有f(n-3)种跳法…… 最后一步跳n级台阶有f(n-n)即f(0)即1种跳法。所以:
f(n) = f(n-1) + f(n-2) + ... + f(1) + f(0) ........ (1)
其中,f(0) = f(1) = 1, 正因如此本题还有个偷懒的写法,直接用f(n) = 2 ^ (n-1)算出计算结果即可。
若采用公式(1)编程,注意以下两点:
- 中间会有许多重复计算,因而为提高效率采用一个数组存储每一步的计算结果
- 计算结果采用int型会超出范围会wrong answer,因此要使用long long型。
代码如下:
//
// main.cpp
// offer9-2
//
// Created by YitongFeng on 7/17/15.
// Copyright (c) 2015 yetong. All rights reserved.
//
#include <iostream>
using namespace std;
long long result[52];
//#define debug
class Solution{
public:
long long frog_jump(int n){
result[0] = 1;
long long ways = 0;
if(n == 0) ways = 1;
for(int i = 0; i < n; i++){
ways += result[i];
result[i+1] = ways;
#ifdef debug
cout << "result" << i << " " << result[i] <<endl;
#endif
}
return result[n];
}
};
int main(int argc, const char * argv[]) {
int n;
while(cin >> n){
if(n > 0){
Solution s;
cout << s.frog_jump(n) << endl;
}
}
return 0;
}
/**************************************************************
Problem: 1389
User: *******
Language: C++
Result: Accepted
Time:10 ms
Memory:1520 kb
****************************************************************/