剑指offer:变态跳台阶

题目

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

解题思路

这题的名字和题面都和跳台阶这题很相似,没看过的同学可以先看看。
很明显,这题最大的改变就是状态转移式由原来的f[n]=f[n-1]+f[n-2]变成了f[n]=1+f[1]+f[2]+...+f[n-1]。这就意味着不能完全照搬斐波那契数列的思想进行解题。但这个状态转移式很明显也具有规律性,我们可以尝试进行一些初步的推导:
在n<2时,f[n]时特殊情况,上述的转移式不成立,因此我们从n=2开始推导。
首先写出式子,f[2]=1+f[1];f[3]=f[2]+1+f[1]。我们尝试将第一个式子代入后面的式子,便得到f[3]=1+f[1]+1+f[1]=2*f[2]。同样的,f[4]=f[3]+1+f[1]+f[2]=2*(1+f[1]+f[2])=2*2*(1+f[1])=2*2*f[2]。
以此类推,我们可以得出,在n>2时,f[n]=2n-2*(f[2])。又f[1]=1,f[2]=1+f[1]=2=2*f[1]。所以状态转移式最终可以简化为f[n]=2n-1*f[1]=2n-1

具体代码

class Solution {
public:
    int jumpFloorII(int number) {
        if (number < 0)
            return -1;
        int sum = 1; 
        for (int i = 2; i <= number; i++) 
            sum *= 2;
        return sum;
    }
};
posted @ 2019-03-31 17:46  Bylight  阅读(148)  评论(0编辑  收藏  举报