You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?


动态规划入门题目

State: dp[i] 指爬到第n个台阶,有多少种方法
function: dp[i] = dp[i - 1] + dp[i - 2].
init: dp[1] = 1, dp[2] = 2.
answer: dp[n]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int climbStairs(int n) {
if (n <= 0)
return 0;
if (n == 1)
return 1;
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];
}

滚动数组优化后为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int climbStairs(int n) {
if (n <= 0)
return 0;
if (n == 1)
return 1;
int[] dp = new int[3];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i % 3] = dp[(i - 1) % 3] + dp[(i - 2) % 3];
}
return dp[n % 3];
}