動態規劃與分治法相似,都是通過組合子問題的解來求解原問題。
動態規劃通常是用來求解最優化問題(optimization problem).這類問題可以有很多個可行解,每個解都有乙個值,我們希望尋找最優值(最大值或者最小值)的解。我們稱這樣的解為問題的乙個最優解(oneoptimization solution)而不是(theoptimization solution),因為有可能有多個解都達到最優值,但是在求解原問題的最優解的時候只需要找出其中的乙個就可以了。就像矩陣鏈乘法問題中,選擇最佳分割位置k的時候,是只需要判斷新的代價是否比之前的選中的k時的代價小,如果不小則不變換k的值。這就說明了,是可能出現另外乙個分割位置與當前記錄的k的位置的代價是一樣的,這就說明了k的最佳劃分位置不止乙個,即原問題的最優解可能不是唯一的,但是動態規劃則是求出原問題的乙個最優解。
通常按照如下四個步驟來設計乙個動態規劃演算法:
1.刻畫乙個最優解的結構特徵;
2.遞迴地定義最優解的值;
3.計算最優解的值,通常採用自底向上的方法;
4.利用計算出的線性構造乙個最優解。
運用動態規劃求解問題的兩個要素分別是最優子結構和子問題重疊。
(1)最優子結構
如果乙個問題的最優解包含其子問題的最優解,我們就稱此問題具有最優子結構性質。因此,某個問題是否適合應用動態規劃演算法它是否具有最優子結構性質是乙個很好的線索(當然,具有最優子結構性質也可能意味著適合應用貪心策略)。
在動態規劃中,通常是自底向上地使用最優子結構。即首先求得子問題的最優解,然後在其中進行選擇,求原問題的最優解。在求解問題的過程中需在涉及的子問題中做出選擇,選擇出能得到原問題最優解的子問題。
使用動態規劃演算法的時候,要求原問題的解的子問題之間是無關的,這個無關指得是,給定原問題p之後,這個問題的最優解可以通過一分為二的兩個子問題a和b,分別求得子問題a和b的最優解,即可得到原問題p的最優解,並且子問題a的解和b的解是不相關的,在a和b相組合原問題最優解的時候除了在介面處的地方之外其他的地方解都是不重合的。這句話其實很好理解,比如矩陣相乘中ai乘到aj,劃分成兩個子問題ai到ak和a(k+1)和aj,分別求這兩個子問題的解,兩個子問題的解除了在ak處是重合的,其他地方再無重複。
(2)重疊子問題
在求解過程中如果遞迴演算法反覆求解相同的子問題,就稱最優化問題具有重疊子問題的性質。這個地方說的是適合用遞迴演算法求解的原問題在求解過程中待分解的子問題的集合是固定的。與之相對的,適合用分治法求解的問題通常在遞迴的每一步都生成全新的子問題。
動態規劃演算法通常利用重疊子問題性質的做法是對每個子問題求解一次,將解存入乙個表中,當再次需要這個子問題時直接查表,每次查表的代表為常量時間。
針對矩陣連乘法問題即可用帶備忘的自頂向下的動態規劃演算法,也可以用自底向上的動態規劃演算法。
動態規劃原理
子問題與原問題具有完全相同的結構 是否可以用結束狀態確定 狀態?不一定具有無後效性?在每個子問題的求解中都利用了它前面的子問題的最優化結果,依次進行,最後乙個子問題所得到的最 優解就是整個問題的最優解 最優化原理 區域性最優解導致全域性最優解 無後效性 dp 首先,請注意無後效性一般是針對問題的分析...
動態規劃原理
運用動態規劃求解最優化問題第一步 若乙個問題的最優解中包含其子問題的最優解,則此問題具有最優解的結構性質。因為使用子問題的最優解構造原問題最優解,所以我們必須確保考察了最優解中用到的所有子問題。如何發掘最優子結構性質 證明問題最優解的第乙個組成部分是做出乙個選擇。例如切割鋼條的第一次切割位置。做出該...
動態規劃原理
動態規劃方法通常用來求解最優化問題 最優子結構 如果乙個問題的最優解包含其子問題的最優解,那麼就稱此問題具有最優子結構性質。某個問題是否適用動態規劃方法,觀察其是否具有最優子結構性質是乙個好的線索 具有最優子結構性質也可能意味著適用貪心策略 實際上,發掘最優子結構性質遵循如下的通用模式 不同問題的最...