算法導論---動態規劃學習

        動態規劃可以稱得上是算法題裏最常見的一種題型,而且一些算法題除了動態規劃使用別的方法會使得效率變得極低。現在就將動態規劃的學習知識點記錄以下。

        判斷一個問題是不是能用動態規劃來求解主要是兩個點:1,是否具有最優子結構,這裏面也就包含子問題的解是不是相關,子問題是不是會一直重複,必須足夠小。2,能形成狀態轉移方程,也就是開始求的數值,在後來疊加時能夠使用,也可以說是重疊。如果一道題能找到這兩個問題點,並且清晰的將狀態轉移方程寫出來,那麼算法可以說是解決了一半。

       那麼最優子結構怎麼找呢?當有很多條件時,怎麼將條件放入狀態轉移方程呢?這裏我們需要分類來說一下幾個基本的方法。

       最優子結構分成兩種求法:1,從中間擴散,也就是組合從一個開始,到兩個,到多個,一直到最長的長度,從每個位置開始的中間擴散(最優二叉搜索樹)。2,從低位到高位,也就是依次累計計算得到之前的問題(切鋼條)。基本上碰到的最優子結構的構思就是這兩種。

  從低位到高位的情況:將題目的變化按兩個條件維度增長變化分成一個二維表格通過對從低位到高位依此增加,對不同條件的情況的結果也就在這個表格中。而這個一定條件的尋找就是問題的關鍵。當然在你勾畫表格的時候你就需要想好,怎麼去構建這個狀態轉移方程,而表結構的出現是使得你的方程更加清晰。這兩者在解題過程中是互相輔助的。得到的優解基本就是上個所有優解加現在的值遞減的一個過程

    中間擴散是從二維邊成一個一維的數組,這個是特定情況,就類似最優二叉搜索樹裏面,一個個組合得到一些最優解,類似這種樹結構或者類似()的結合,需要綁定在一起的這類問題,都可以使用這種中間擴散的辦法。這種的狀態轉移方程就是從(i,j)這樣擴散達到題目的解。

     在構思最優子結構之前,可能還需要思考一點的就是原本的目標結構的順序需不需要改變,有些題目改變順序之後算法就能簡化很多(雙調歐幾里德旅行商問題)。

     差不多上面就是動態規劃的一些總結,算法這個看是看不會的,必須自己動手做,多思考。算法導論後面的幾道思考題大家可以做一遍基本上就能摸到這個方法的一點小門道,而動態規劃的路子在我看來畢竟是有限的,只是方法實現不同所得到的效率的差距,這就是需要進階的地方了。在寫一些算法題時,有些題很明瞭看樣式就知道怎麼解,但是有些題很隱晦,我們得用不同得方式去套着試試(也許是我修行並不夠)。多一些思路方法,解題得路子就 自然會多起來。最後建議大家在解完一道題之後,將答案的複雜度都分析一下,有沒有還能優化的點,網上找找別人怎麼做的。這樣纔能有進步,不然做出來就不管跟沒做是沒什麼區別的。 下一章:貪心算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章