Leetcode 爬樓梯 (Python解法)
阿新 • • 發佈:2018-12-13
問題定義:
演算法思路:
本題是動態規劃的一個經典例項。
解動態規劃問題的步驟:
1.找出狀態轉移方程
2.設計自頂而下的遞迴演算法 (Top-down approach)
3.改寫成自底而上的迭代演算法(Bottom-up approach)
比較熟練或者問題比較簡單時可以跳過第二步。
在本題中,通過舉例可以推出狀態轉移方程。首先要注意到每一步只能走一個階梯或者兩個階梯。假如有n個階梯,可以分成兩部分來走,先走一個階梯,再走剩下的n-1個階梯,或者先走兩個階梯,再走剩下的n-2個階梯,有兩種組合方式。對於剩下的n-1或者n-2個階梯怎麼走呢?也是相同的處理方法,先走一個階梯或者先走兩個階梯,還是兩種組合。一直遞迴下去即可。
顯然,階數為n時,我們的組合有f(n-1) + f(n-2)種,其中f(n)表示n個階梯對應的走法。
狀態轉移方程:f(n) = f(n-1) + f(n-2)
只要遞迴下去就能解決問題,但動態規劃的妙處是計算結果的複用,減少重複的計算。求解每一個n時,我們將計算結果f(n)存起來,就能在後續計算更大的n時呼叫。比如我們讓從i = 1開始迭代,直到i = n,這樣每一步都在呼叫先前計算的結果。
注意到f(n)需要前兩項的值,我們要讓i從3開始,前兩項要初始化(自己寫)。
程式碼: