對動態規划,做個總結,我們從一個例子開始:
有一座高度是10級台階的樓梯,從下往上走,每跨一步只能向上1級或者2級台階。要求用程序來求出一共有多少種走法。
比如,每次走1級台階,一共走10步,這是其中一種走法。我們可以簡寫成 1,1,1,1,1,1,1,1,1,1。
再比如,每次走2級台階,一共走5步,這是另一種走法。我們可以簡寫成 2,2,2,2,2。
當然,除此之外,還有很多很多種走法。
這里就要用到了動態規划的思想了:動態規划(Dynamic Programming)是一種分階段求解決策問題的數學思想。總結起來就是一句話,大事化小,小事化了。
我們用動態規划問題來看看上述的問題吧:
問題建模:
假如只差一步就能走完整個樓梯,要分為幾種情況?因為每一步能走一級或者兩級台階,所以有如下兩種情況:
1.最后一步走2級台階,也就是從8級到10級
2.最后一步走1級台階,也就是從9級到10級
那么在上面的基礎上假設1級到8級有X種走法,1級到9級有Y種走法,那么1級到10級有幾種走法?
實際上,10級台階的所有走法可以根據最后一步的不同分為兩個部分。
第一部分:最后一步從9級到10級,這種走法的數量和1級到9級的數量一致,也就是Y種。
第二部分:最后一步從8級到10級,這種走法的數量和1級到8級的數量一致,也就是X種。
總的走法就是兩種走法的總和,也就是SUM=X+Y種。
我們把10級台階的走法表達為F(10)此時:
F(10) = F(9)+F(8)
F(9) = F(8)+F(7)
F(8) = F(7)+F(6)
...
F(3) = F(2)+F(1)
看到沒,我們把一個復雜的問題分階段分步的簡化,簡化成簡單的問題,這就是動態規划的思想。
當只有1級台階和2級台階時走法很明顯,即F(1)=1、F(2)=2,可以歸納出如下公式:
F(n) = F(n-1) + F(n-2)(n >= 3);
F(2) = 2;
F(1) = 1;
動態規划中包含三個重要的概念,最優子結構、邊界、狀態轉移公式。
上面我們分析出F(10)=F(9)+F(8), 其中,F(9)和F(8)是F(10)的最優子結構。
當只有1級和2級台階時,我們可以直接得出結果,而無需再次簡化。我們稱F(2)和F(1)是問題的"邊界",如果一個問題沒有邊界,那么這個問題就沒有有限解。
F(n) = F(n-1) + F(n-2)是階段之間的狀態轉移公式,它是動態規划的核心,決定了問題的每個階段和下階段之間的關系。
至此,動態規划的“問題建模就完成了”。
求解問題: