Sword10- II——青蛙跳台阶问题
方法1——递归(将会超时)
- 思路:反过来从最后面看起,青蛙到达最后一个台阶,只能由倒数第二个台阶跳2级、或倒数第一个台阶跳1级,再以此往前类推即可
- 特殊情况与临界分析:只有0级台阶或1级台阶时
- 终止条件:青蛙跳到n级台阶时停止
- 步骤:
public int numWays(int n) {
if (n == 0 || n == 1) {
return 1;
}
return (numWays(n - 1) + numWays(n - 2)) % 1000000007;
}
方法2——动态规划
- 思路:
- 确定状态:dp为一维数组,第n个元素为dp[n]
- 转移方程:F(N) = (F(N - 1) + F(N - 2)) % 1000000007
- 初始状态和边界情况:F(0) = 0,F(1) = 1
- 计算结果:dp[n]即为第n个元素
- 特殊情况与临界分析:只有0级台阶或1级台阶时
- 终止条件:青蛙跳到n级台阶时停止
- 步骤:同斐波那契数列,特殊情况也可包含在内,只是青蛙中n为0输出是1,其余不变
public int numWays(int n) {
int cur = 1, next = 1, tmp = 0;
for (int i = 0; i < n; i++) {
tmp = (cur + next) % 1000000007;
cur = next;
next = tmp;
}
return cur;
}