九度OJ-题目1389:变态跳台阶

题目链接地址:

九度OJ-题目1389:变态跳台阶


题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

输入:
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=50)。

输出:
对应每个测试案例,
输出该青蛙跳上一个n级的台阶总共有多少种跳法。

样例输入:
6

样例输出:
32


解题思路:

看到“变态跳台阶”这个题目的时候,我心里还有点小害怕,囧。。。但是仔细一分析,却发现这个题一点也不“变态”,O(∩_∩)O~
假设青蛙跳上一个n级的台阶的跳法数目为f(n),而青蛙一次可以跳上1级台阶,也可以跳上2级……也可以跳上n级。所以可以分以下n中情况进行讨论:
(1) 如果青蛙选择跳上1级台阶,则剩下的台阶数目是n - 1, 跳上一个n – 1级的台阶的跳法数目是f(n - 1);
(2) 如果青蛙选择跳上2级台阶,则剩下的台阶数目是n - 2, 跳上一个n – 2级的台阶的跳法数目是f(n - 2);
(3) 如果青蛙选择跳上3级台阶,则剩下的台阶数目是n - 3, 跳上一个n – 3级的台阶的跳法数目是f(n - 3);
……
(n - 1) 如果青蛙选择跳上n - 1级台阶,则剩下的台阶数目是1, 跳上一个1级的台阶的跳法数目是f(1);
(n) 如果青蛙选择跳上n级台阶,则剩下的台阶数目是0, 跳上一个0级的台阶的跳法数目是f(0)。
因此可以得知,
f(n) = f(n-1) + f(n-2) + ... + f(2) + f(1) + f(0)                                                           [1]
f(n-1) = f(n-2) + f(n-3) + ... + f(1) + f(0)                                                                 [2]
……                                                                                                                     ......
f(2) = f(1) + f(0)                                                                                                     [n-2]
f(1) = f(0)                                                                                                              [n-1]
f(0) = 1                                                                                                                  [n]
由公式[1]和公式[2]可以推出
f(n) = f(n-1) + f(n-1) = 2 * f(n-1)。
对于公式[n]:f(0) = 1,我是这样理解的:青蛙在跳上一个只有1级的台阶时,只有跳上1级台阶这一个选择,而剩余台阶数目为0,因此可以得出f(1) = f(0) = 1,所以可推出以下公式:


AC代码如下:

#include<stdio.h>
 
/**
* 计算出青蛙跳上一个n级的台阶总共有多少种跳法
* f(n) = f(n-1) + f(n-2) + ... + f(2) + f(1) + f(0) ---->  f(n) = 2*(f(n-1))   // n >= 2
* @param jumpMethods  用于保存跳台阶的跳法数目
* @return void
*/
void getNumberOfSuperJumpSteps(long long * jumpMethods)
{
    int i;
    jumpMethods[1] = 1;
    for(i = 2;i <= 50;i++)
    {
       jumpMethods[i] = 2 * jumpMethods[i - 1];
    }
}
 
int main()
{
    int n;
    long long jumpMethods[51];               // 记录跳台阶的方法数目
    getNumberOfSuperJumpSteps(jumpMethods);
    while(EOF != scanf("%d",&n))
    {
        printf("%lld\n",jumpMethods[n]);
    }
    return 0;
}
 
/**************************************************************
    Problem: 1389
    User: blueshell
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:912 kb
****************************************************************/


你可能感兴趣的:(面试题,剑指offer)