地址:https://leetcode-cn.com/problems/climbing-stairs/submissions/
这道题主要的坑在边界条件的设置与理解。
- 状态:
dp[i]
表示爬到第n
阶台阶的方法数 - 状态转移方程:分类讨论。
dp[i] = dp[i - 1] + dp[i - 2];
- 初始化:看状态转移方程,初始化的时候,需要初始化
dp[0]
和dp[1]
。
dp[0] = 1
表示一层台阶也不爬,这可以算为一种方法。同理dp[1] = 1
或者还可以这样初始化:
dp[1] = 1
、dp[2] = 2
,其实我们不需要 dp[0]
,这样就好理解了。
- 输出:
dp[n]
。
下面两段都是可以 Accept 的代码,请读者比较它们在初始化时候的不同。
Java 代码:
public class Solution {
public int climbStairs(int n) {
int[] dp = new int[n + 1];
// 初值设置很重要
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
Java 代码:
public class Solution {
public int climbStairs(int n) {
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];
}
}
记忆化递归的写法:
Java 代码:
public class Solution {
private int[] cache;
private int calcways(int n) {
if (cache[n] != 0) {
return cache[n];
}
if (n == 0) {
return 1;
}
if (n == 1) {
return 1;
}
cache[n] = calcways(n - 1) + calcways(n - 2);
return cache[n];
}
public int climbStairs(int n) {
cache = new int[n + 1];
return calcways(n);
}
}