1、一次可以跳一个台阶或者两个台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
提示:
0 <= n <= 100
设跳上 n 级台阶有 f(n) 种跳法。在所有跳法中,青蛙的最后一步只有两种情况:跳上 1 级或 2 级台阶。
1、 当为 1 级台阶: 剩 n-1个台阶,此情况共有 f(n−1) 种跳法;
2、 当为 2 级台阶: 剩 n-2个台阶,此情况共有 f(n−2) 种跳法。
f(n) 为以上两种情况之和,即 f(n)=f(n-1)+f(n-2)
class Solution {
public int numWays(int n) {
if (n == 0)
return 1;
if (n <= 2)
return n;
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = (dp[i - 1] + dp[i - 2]);
}
return dp[n];
}
}
2.一次可以跳一个台阶、两个台阶或者三个台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,还可以跳上3级台阶。
求该青蛙跳上一个 n级的台阶总共有多少种跳法。
最后一步可能是从第n-1阶往上走1阶、从n-2阶往上走2阶,或从第n-3阶往上走3阶。因此,抵达最后一阶的走法,其实就是抵达这最后三阶的方式的总和。
class Solution {
public static int numWays(int n) {
if (n == 0)
return 1;
if (n == 2)
return 2;
if (n == 3)
return 4;
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
return dp[n];
}
}