動態規划


對動態規划,做個總結,我們從一個例子開始:

有一座高度是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)是階段之間的狀態轉移公式,它是動態規划的核心,決定了問題的每個階段和下階段之間的關系。

至此,動態規划的“問題建模就完成了”。

求解問題:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM