剑指offer JZ-9
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
示例1
返回值
复制4
思路
JZ-8的简单变形,定义dp[k]为到达第k阶台阶的方案数
不难看出:dp[k] = dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1
后面的+1 实际上就是一次跳k阶这一种方案
动态规划代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution { public: int jumpFloorII(int number) { if(number == 1) return 1; if(number == 2) return 2; vector<int> dp; dp.push_back(1); dp.push_back(1); dp.push_back(2); for(int i=3;i<=number;i++) { int sum = 0; for(int j=0;j<i;j++) sum += dp[j]; dp.push_back(sum); } return dp[number]; } };
观察代码,我们 【dp[k] = dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1】这一部分的计算有重复
为了节约时间和空间,我们可以用一个变量sum来记录dp[1] + dp[2] + dp[3] + .... + dp[k-1] + 1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution { public: int jumpFloorII(int number) { if(number == 1) return 1; if(number == 2) return 2; int sum = 4, now = 0; for(int i=3;i<=number;i++) { now = sum; sum += now; } return now; } };