題目描述
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1. 1 階 + 1 階
2. 2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階
動態規劃
情況一:
首先我們考慮基礎情況,就是當n = 1的情況(即爬1階的樓有多少種爬法),很顯然,只有一種,就是爬一階到終點。
基礎情況
情況二:
這個情況就是一個遞歸的情況了,假設爬到第n階臺階,有如下兩種選擇
- 由上一個臺階(n-1)向上走一步。
-
由上上個臺階(n-2)向上走兩步。
遞歸情況
那么假設假設到n階臺階有dp(n)種走法,那么當n > 1時,有如下的遞推式:
Go實現:
func climbStairs(n int) int {
// 動態規劃思想
if n <= 1 {
// 基礎情況
return 1
}
dp := make([]int,n+1)
dp[0] = 1
dp[1] = 1
// 帶入公式進行迭代
for i := 2; i <= n; i++ {
dp[i] = dp[i-1] + dp[i-2]
}
return dp[n]
}
C++實現(改進版,不使用數組直接使用三個變量進行迭代,節省內存):
class Solution {
public:
int climbStairs(int n) {
// 基礎情況
if(n <= 1) return 1;
int pre1 = 1,pre2 = 1;
int cur;
// 動態規劃進行迭代
for(int i = 2;i <= n;i++){
cur = pre1 + pre2;
pre1 = pre2;
pre2 = cur;
}
return pre2;
}
};