動態規劃的本質

動態規劃方法要尋找符合“最優子結構“的狀態和狀態轉移方程的定義,在找到之後,這個問題就可以以“記憶化地求解遞推式”的方法來解決。而尋找到的定義,纔是動態規劃的本質。所以問題的重點在於如何鑑定“某一類問題”是動態規劃可解的而不是糾結解決方法是遞歸還是遞推!

怎麼鑑定dp可解的一類問題需要從計算機是怎麼工作的說起。
計算機的本質是一個狀態機,內存裏存儲的所有數據構成了當前的狀態,CPU只能利用當前的狀態計算出下一個狀態,當你企圖使用計算機解決一個問題是,其實就是在思考如何將這個問題表達成狀態(用哪些變量存儲哪些數據)以及如何在狀態中轉移(怎樣根據一些變量計算出另一些變量)。所以所謂的空間複雜度就是爲了支持你的計算所必需存儲的狀態最多有多少,所謂時間複雜度就是從初始狀態到達最終狀態中間需要多少步!

一個問題是該用遞推、貪心、搜索還是動態規劃,完全是由這個問題本身階段間狀態的轉移方式決定的!
每個階段只有一個狀態->遞推;
每個階段的最優狀態都是由上一個階段的最優狀態得到的->貪心;
每個階段的最優狀態是由之前所有階段的狀態的組合得到的->搜索;
每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到不管之前這個狀態是如何得到的->動態規劃。(無後效性)


動態規劃迷思

  1. “緩存”,“重疊子問題”,“記憶化”
    這三個名詞,都是在闡述遞推式求解的技巧。以Fibonacci數列爲例,計算第100項的時候,需要計算第99項和98項;在計算第101項的時候,需要第100項和第99項,這時候你還需要重新計算第99項嗎?不需要,你只需要在第一次計算的時候把它記下來就可以了。上述的需要再次計算的“第99項”,就叫“重疊子問題”。如果沒有計算過,就按照遞推式計算,如果計算過,直接使用,就像“緩存”一樣,這種方法,叫做“記憶化”,這是遞推式求解的技巧。
    這種技巧,通俗的說叫“花費空間來節省時間”。都不是動態規劃的本質,不是動態規劃的核心。

  2. “遞歸”
    遞歸是遞推式求解的方法,連技巧都算不上。

  3. “無後效性”,“最優子結構”
    上述的狀態轉移方程中,等式右邊不會用到下標大於左邊i或者k的值,這是”無後效性”的通俗上的數學定義,符合這種定義的狀態定義,我們可以說它具有“最優子結構”的性質,在動態規劃中我們要做的,就是找到這種“最優子結構”。在對狀態和狀態轉移方程的定義過程中,滿足“最優子結構”是一個隱含的條件(否則根本定義不出來)。
    需要注意的是,一個問題可能有多種不同的狀態定義和狀態轉移方程定義,存在一個有後效性的定義,不代表該問題不適用動態規劃。

  4. 誤區
    由於接觸最早的dp問題就是揹包問題,想當然的認爲dp問題的解的時間複雜度就是0(n^2),這是一個錯誤的認識。dp是指一種思想,它的本質是找出狀態和狀態轉移的定義,至於如何求解以及時間複雜度要看你具體怎麼處理得到當前狀態。


小結

所有的決策類求最優解的問題都是在狀態空間內找一個可以到達的最佳狀態。搜索的方式是去遍歷每一個點,而動態規劃則是把狀態空間變形,由此變成從初始到目標狀態的最短路問題。

依照這種描述:假若你的問題的結論包含若干決策,則可以認爲從初始狀態(邊界條件)到解中間的決策流程是一個決策狀態空間中的轉移路線。前提是:你的狀態描述可以完整且唯一地覆蓋所有有效的狀態空間中的點,且轉移路線包含所有可能的路徑。

這個描述是包含動態規劃兩大條件的。所謂無後效性,指狀態間的轉移與如何到達某狀態無關。如果有關,意味着你的狀態描述不能完整而唯一地包括每一個狀態。如果你發現一個狀態轉移有後效性,很簡單,把會引起後效性的參數作爲狀態描述的一部分放進去將其區分開來就可以了;最優子結構說明轉移路線包含了所有可能的路徑,如果不具備最優子結構,意味着有部分情況沒有在轉移中充分體現,增加轉移的描述就可以了。最終所有的搜索問題都可以描述成狀態空間內的狀態轉移方程,只是有可能狀態數量是指數階的,有可能不滿足計算要求罷了。

這樣的描述下,所有的動態規劃問題都可以轉變爲狀態空間內大量可行狀態點和有效轉移構成的圖的從初始狀態到最終狀態的最短路問題。於是乎,對於動態規劃,他的本質就是圖論中的最短路;階段可以去除,因爲不一定有明確的階段劃分。

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