1. 程式人生 > >Leetcode 爬樓梯 (Python解法)

Leetcode 爬樓梯 (Python解法)

問題定義:

演算法思路:

本題是動態規劃的一個經典例項。

解動態規劃問題的步驟:

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開始,前兩項要初始化(自己寫)。

程式碼: