一、问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
二、实现
使用动态规划,如果直接使用斐波那契复杂度高
class Solution {
public int numWays(int n) {
if(n==0 || n==1) return 1;
int dp[] = new int[n+1]; //上0,1,2,...,n级台阶
dp[0] = 1;
dp[1] = 1;
for(int i=2;i<=n;i++){
dp[i] = (dp[i-1]+dp[i-2])%1000000007;
}
return dp[n];
}
}
三、跨台阶升级版
题目基本一样,有一个 n 阶的楼梯,你从最下面往上跳,每次可以跳1阶或2阶,但是不能连续跳两次2阶,有多少种方法可以跳到楼顶?
四、实现
利用之前基础版的思路,对于第 n 阶,你只有两种方式跳上去:
- 从 n-1 阶跳1阶跳上去
- 从 n-2 阶跳2阶跳上去(同时 n-2 阶必须是跳 1 阶跳上去的)
因此可以得到递推式:
f(n) = f(n-1) + f(n-3)
即从n-1跳1阶到n 或者 从n-2跳2阶到n(前提是 n-3阶要跳1阶到n-2,从n-3阶到n-2阶只有这一种选择,故为f(n-3))
public class Test{
public static void main(String args[]) {
int n = 5;
int res = getRes(n);
System.out.println(res);
}
public static int getRes(int n) {
if(n==0 || n==1) return 1;
if(n==2) return 2;
if(n==3) return 3;
int dp[] = new int[n+1];
dp[0]=1;dp[1]=1;dp[2]=2;dp[3]=3;
for(int i=4;i<=n;i++) {
dp[i] = dp[i-1]+dp[i-3];
}
return dp[n];
}
}
这篇博客介绍了如何使用动态规划方法解决经典的青蛙跳台阶问题,以及其不允许连续跳两次2阶的变式。通过递推公式,展示了如何高效地计算不同台阶数的跳法,并给出了Java代码实现。
&spm=1001.2101.3001.5002&articleId=116503627&d=1&t=3&u=cc7114d7207043098957fa7ef3450457)
613

被折叠的 条评论
为什么被折叠?



