動態規劃
動態規劃是通過把原問題分解為相對簡單的子問題的方式來求解復雜問題的方法。
適用場景
動態規劃常常適用于有重疊子問題
和最優子結構
性質的問題。
問題特征
最優子結構:當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。
重疊子問題:在用遞歸算法自頂向下解問題時,每次產生的子問題并不總是新問題,有些子問題被反復計算多次。動態規劃算法正是利用了這種子問題的重疊性質,對每一個子問題只解一次,而后將其解保存在一個表格中,在以后盡可能多地利用這些子問題的解。
原理
若要解一個給定問題,我們需要解其不同部分(即子問題),再合并子問題的解以得出原問題的解。 通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量: 一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次需要同一個子問題解之時直接查表。 這種做法在重復子問題的數目關于輸入的規模呈指數增長時特別有用。
用動態規劃解決問題的核心就在于填表,表格填寫完畢,最優解也就找到。
分治和動態規劃
共同點:
二者都要求原問題具有最優子結構性質,都是將原問題分而治之,分解成若干個規模較小(小到很容易解決的程序)的子問題.然后將子問題的解合并,形成原問題的解.
不同點:
1.分治法將分解后的子問題看成相互獨立的,通過用遞歸來做。
2.動態規劃將分解后的子問題理解為相互間有聯系,有重疊部分,需要記憶,通常用迭代來做。
解題步驟
尋找遞推表達式