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]; }
|