動態規劃 爬樓梯

2021-10-03 08:17:28 字數 1549 閱讀 6453

假設你正在爬樓梯。需要 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 階

這是一道典型的一維動態規劃問題,因為第i階到第n階有多少種走法取決於更高階i+1和i有幾種走法。

思路:設有n階樓梯,因為每次只能走1步或者2步,那麼第n階的前一步要麼走到了n-1階,要麼走到了n-2階。

從n-2階到第n階有兩種方式:1)走1步到n-1,再走1步到n;2)走2步到n。

從n-1階到第n階只有一種方式:走1步到n。

那麼再往前,第n-3階到第n階可以怎麼走呢?

從n-3階到第n階,要麼先到n-1階,要麼先到n-2階。

於是:第n-3階到第n階的方式就是第n-2階到第n階和第n-1階到第n階的方式之和,即:

dp[n-3] = dp[n-2] + dp[n-1]

即   dp[n] = dp[n+1] + dp[n+2] 

初始化有:dp[n-2] = 2,dp[n-1] = 1

class solution(object):

def climbstairs(self, n):

""":type n: int

:rtype: int

"""dp = [none for i in range(n)]

dp[n-2] = 2

dp[n-1] = 1

for i in range(n-3, -1, -1): # 倒著走回來,逐步得到從n-3到0,每一階到第n階的方式數

dp[i] = dp[i+1] + dp[i+2]

return dp[0]

當然也可以正著走,要上到第n階,要麼從n-1走,要麼從n-2走,於是有:dp[n] = dp[n-1] + dp[n-2]。

注意排除特殊情況。(測試結果表明正著走比倒著走耗時間)

class solution(object):

def climbstairs(self, n):

""":type n: int

:rtype: int

"""if n <= 2:

return n

dp = [none for i in range(n+1)]

dp[0] = 0

dp[1] = 1

dp[2] = 2

for i in range(3, n+1):

dp[i] = dp[i-1] + dp[i-2]

return dp[n]

參考:

動態規劃 爬樓梯

假設你正在爬樓梯,需要n步你才能到達頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?比如n 3,1 1 1 1 2 2 1 3,共有3種不同的方法 返回 3 解題思路 沒接觸過動態規劃的時候,我用排列組合做的,在我這篇部落格中 可以看一下。實際上,這個題目就是乙個斐波那契數列,這...

爬樓梯 動態規劃

假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1.1 階 1 階 2.2 階 示例 2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。1...

動態規劃 爬樓梯

乙個 n 階的樓梯,每次能走 1 2 階,問走到 n 階一共多少種走法?剛開始遇到這題時,我想到的是數學的做法,也就是排列組合。數學的解法是這樣的 以11階台階為例,所以此時的 就是這樣的 n int input count 0a n 2b 1if n 2 0 while b a count mat...