算法:動態規劃
動態規劃與分治法相似,都是通過組合子問題的解來求解原問題的方法。
分治法:是將原問題劃分爲互不相交的子問題,遞歸地求解子問題,再將它們的解組合起來,求出原問題的解。
動態規劃:應用於子問題重疊的情況,即不同的子問題有公共的子問題。
在這種情況下,分治法會做許多不必要的工作。它會反覆地求解那些公共子問題,而動態規劃算法對每個子問題只求解一次,將其解保存在一個表格中,無需每次求解一個子問題時都重新計算,避免了這種不必要的計算工作。
我們通常情況下,按照如下4步設計一個動態規劃算法。
1.刻畫一個最優解的結構特徵。
2.地歸地定義最優解的值。
3.計算最優解,通常採用自底向上的方法。
4.利用計算出來的信息構造出一個最優解。
動態規劃有兩種等價的實現方法
第一種方法稱爲帶備忘的自頂向下法(top-down with memorization)。次方法按照自然的遞歸形式編程,但過程中會保存每個子問題的解(通常會保存在一個數組,或者散列表中)。當需要一個自問題的解時,過程首先檢查是否已經保存過此解。如果是則直接返回保存的值,從而節省了計算時間;否則按通過的方式計算這個子問題。我們稱這個過程是帶備忘的(memorized),因爲它已經記住了之前,已經計算出來的結果。
第二種方法稱爲自底向上法(bottom-up method)。這個方法一般需要恰當地定義自問題規模的概念,使得任何子問題的求解只依賴於“更小的”子問題的求解。因而我們可以將自問題按照規模排序,按由小至大的順序進行求解。當求解某個子問題時,它所依賴的那些更小的子問題都已求解完畢,結果已經保存了。每個子問題只需要求解一次,當我們求解它(也是第一遇到它)時,它的所有前提子問題都已求解完成。