class Solution {
public:
int numWays(int n) {
// 五部曲
// 1. 确定dp数组以及下标含义
// dp[i] 跳上第i层有多少跳法
// dp[i-1] 跳上第i-1层有多少跳法
// dp[i-2] 跳上第i-2层有多少跳法
// 2. 确定递推公式
// 第i层可以由[i-1]层跳一步或者[i-2]层跳两步到来
// 因此dp[i] = dp[i-1] + dp[i-2] (i>=2时生效)
// 3. 确定数值初值
// dp[0] = 1, dp[1] = 1
// 4. 确定遍历顺序
// for(int i=2; i<=n; i++)
// 5. 举例验证
// n = 0 or 1 , return 1
// n = 2, dp[2] = dp[1] + dp[0] = 2 符合!
// n = 3, dp[3] = d[2] + dp[1] = 3 符合!
// ....
// 可以确定,本质上就是斐波那契,只不过初始值不同
if(n<=1)
return 1;
int dp[2];
dp[0] = 1;
dp[1] = 1;
const int MOD = 1000000007;
for(int i=2; i<=n; i++){
int sum = (dp[1] + dp[0]) % MOD;
dp[0] = dp[1];
dp[1] = sum;
}
return dp[1];
}
};
剑指 Offer 10- II. 青蛙跳台阶问题
最新推荐文章于 2024-11-07 14:52:19 发布