【技術文檔】《算法設計與分析導論》R.C.T.Lee等·第7章 動態規劃

因爲種種緣由(看這一章間隔的時間太長,弄不清動態規劃、分治、遞歸是什麼關係),致使這章內容看了三遍才基本看懂動態規劃是什麼。動態規劃適合解決可分階段的組合優化問題,但它又不一樣於貪心算法,動態規劃所解決的問題的各個階段是相互關聯的,一個階段的選擇會影響其它階段的選擇。動態規劃有兩個優勢:一是能夠排除一些解,另外一個是能夠幫助咱們系統化的解決問題,使問題變得清晰。算法

下面就說一下我對動態規劃、分治、遞歸這三者的理解。分治算法是將原問題分解成兩個較小的問題,而動態規劃是將問題分紅不一樣的階段(步驟),固然,正如上面所說的,咱們要注意加以區別動態規劃和貪心算法所解決問題的類型。使我(們)把動態規劃和分治混在一塊兒的就是它們都有遞歸函數,那麼遞歸和它們是什麼關係呢?個人理解是動態規劃和分治算法是一種抽象的算法,而遞歸是一種具體的實現手段。說了這麼多,下面就舉兩個例子來講明動態規劃方法具體是怎樣實現的。編程


求兩點之間的最短路徑問題。請你們稍微觀察一下下圖:編程語言

 

咱們注意到,從S到F的最短路徑必定通過A、B、C中的一點和D、E中的一點,所以,咱們能夠將該問題分紅多個階段,第一階段是求D、E分別到F的最短距離,第二階段是求A、B、C通過D、E中的一點到F的最短距離,第三階段是求S通過A、B、C中的一點到F的最短距離,具體步驟以下:函數

  • 第一階段:(D,F)=2,(E,F)=3(其中(D,E)表示D到F的最短距離,其它類推)
  • 第二階段:(A,F)=min{(A,D)+(D,F),(A,E)+(E,F)}=min{3+2,4+3}=5
            (B,F)=min{(B,D)+(D,F),(B,E)+(E,F)}=min{2+2,5+3}=5 
            (C,F)=min{(C,E)+(E,F)}=min{1+3}=4
  • 第三階段:(S,F)=min{(S,A)+(A,F),(S,B)+(B,F),(S,C)+(C,F)}=min{1+5,3+4,6+4}=6

因此從S到F的最短路徑距離是6,經過上面的步驟能很容易獲得從S到F的最短路徑爲S->A->D->F。從這個例子中,也許咱們不能很好地體會動態規劃是怎樣運用遞歸的,那咱們就從下面的例子中簡單說明遞歸在動態規劃中的做用。學習

最長公共子序列問題。在這就不介紹什麼是最長公共子序列問題了。運用動態規劃的思想,咱們依然考慮將問題分紅多個階段,並從後往前想。咱們應該能想到最長公共子序列問題最後一個階段是判斷兩個字符串的最後一個字符是否相同。優化

  • 若相同,則最長公共子序列必定包含這個字符,咱們只需判斷 的最長公共子序列便可。
  • 若不一樣,最長公共子序列必定是在 中。

用表達式表達以下:spa


算法設計與分析這門課就學到這了,拋去用編程語言具體實現,總體來講仍是很好理解的。接下來我將對計算機的其餘課程進行復習,但願本身能堅持學習,在學習的過程當中能有當初上課時不同的收穫。設計

相關文章
相關標籤/搜索