假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是乙個正整數。
def
climb_stairs
(n):
way =[0
,1,2
]for i in
range(3
, n +1)
:1]+ way[i -2]
)return way[n]
defeasy_climb
(n):
return easy_climb(n -1)
+ easy_climb(n -2)
if n notin[
0,1,
2]else n
1.線性模型
最經典的問題就是斐波那契數列的問題,每個數的值都是乙個狀態,可以用f[i]表示表示第i個數的值是多少。每個數都是由f[i-1]+f[i-2]轉移而來。
另外乙個經典的問題就是最長上公升自序列(lis),有一串串行,要求找出它的一串子串行,這串子序列可以不連續,但必須滿足它是嚴格的單調遞増的且為最長的。把這個長度輸出。
示例:1 7 3 5 9 4 8 結果為4。
我們非常容易表示他的狀態,我們用f[i]表示以第i個數結尾的,最大的上公升自序列是多少?那麼它是怎麼轉移的呢?非常容易想到肯定是從左邊的的數轉移而來,能轉移的數滿足什麼條件呢?肯定是比a[i]更小的。
線性模式還可以拓展成二維問題,例如揹包問題,用f[i][j]表示前i個物品,湊成大小為j的揹包,最大的價值是多少。
這類問題非常的多,但是思路都是這樣,無非就是從左往右,從上到下,從低維到高維進行轉移。
2.區間模型
對於每個問題,都是由子區間推導過來的,我們稱之為區間模型,下面是乙個例子。
我們有乙個連續的序列,每個序列上面都是乙個數字c[i],每次我們都能夠消滅乙個連續的回文子串行,消滅之後左右會合併,成為乙個新序列,問最少需要多少次才能夠把整個序列消滅掉。回文就是從左到有從右到左讀到的序列都是一樣的。題目比較抽象,我們通過一些例子來說明這個問題吧?例如一開始的序列是1 4 4 2 3 2 1,那麼我們最少需要2次,先消滅掉4 4 , 然後再消滅調1 2 3 2 1.第二個例子是 1 2 3 4 5 5 3 1,我們先消滅掉2 然後再消滅掉4, 最後消滅 1 3 5 5 3 1, 需要3次。
3.樹狀模型
我們在資料結構樹上面進行尋求最優解、最大值等問題,上述我們講的這個績效考核就是乙個樹狀模型,具體不再累敘。
實現的套路
我們實現動態規劃演算法,常用的是2個實現套路,乙個是自底向上,另外乙個是自頂向下。無論是何種方式,我們都要明確動態規劃的過程,把狀態表示、狀態轉移、邊界都考慮好。
自底向上 ,簡單來說就是根據初始狀態,逐步推導到最終狀態,而這個轉移的過程,必定是乙個拓撲序。如何理解這個拓撲序問題呢,甲總監下面有x,y,z兩個小組,甲總監不會一拿到x組最優秀的三個人,就立馬去跟a經理匯報,而是要等到y,z小組也選出來之後,也就是自己下面所有子問題都解決了,才會繼續向匯報。如果推導的過程不是乙個拓撲序,那麼要麼得到錯誤的結果,要麼演算法就要退化。
自底向上一般用來解決什麼問題呢?那就是可以輕鬆確定拓撲序的問題,例如線性模型,都是從左往右進行轉移,區間模型,一般都是從小區間推導到大區間。自底向上的乙個經典實現是斐波那契數列的遞推實現,即f[i] = f[i - 1] + f[i - 2] 。
自頂向下,也就是從最終狀態出發,如果遇到乙個子問題還未求解,那麼就先求解子問題。如果子問題已經求解,那麼直接使用子問題的解,所以自頂向下動態規劃又有乙個形象生動的名字,叫做記憶化搜尋,一般我們採用遞迴的方式進行求解。
自頂向下,我們一般用在樹上面,因為我們根據父結點,很容易找到所有的子問題,也就是所有的子結點,而自底向上的話,我們要去統計這個結點的所有兄弟結點是否已經實現。會稍微複雜一點,而且比較難理解。
無論是自頂向下還是自底向上,都只是**實現的一種套路,隨便你採用哪乙個,都是可以解的,只是看你的選擇而已。
最後分享乙個parse尤大vue的部落格:
python爬樓梯遞迴 爬樓梯(Python3)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...
python爬樓梯演算法 爬樓梯(Python3)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...
爬樓梯 python Python3爬樓梯演算法示例
假設你正在爬樓梯。需要 n 步你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。方案一 每一步都是前兩步和前一步的和 class solution object def climbstairs self,n type n int rt...