九度OJ1389剑指offer面试题9变形:变态跳台阶


题目描述

一只青蛙一次可以跳上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 
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] <#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
****************************************************************/

你可能感兴趣的:(OJ)