點此訪問
第一部分比較抽象,建議先大體上瀏覽一下,有個初步印象,等熟悉第二部分的具體的例題之後,回過頭再仔細總結這一部分。
首先說明一點,動態規劃(dynamic programming)中的programming指的是一種**法,而不是程式設計的意思。動態規劃法的思想妙就妙在這個「**」上。根據動態規劃思想,要求解乙個問題,先求解它的子問題,然後根據子問題的解,得到該問題的解。而要求解子問題,則要繼續求解子問題的子問題,如此可以遞迴的進行下去。這裡需要注意的是,不同的問題,可能具有公共的子問題,這些公共的子問題的解,求解一次之後,問題的解可以記錄在**中,避免多次求解。
最優化問題(optimization problem),這類問題可以有很多可行的解,每個解都有乙個值,動態規劃法可以求出具有最優值(最大值或最小值)的解。
刻畫乙個最優解的結構特徵。也就是定義狀態。
遞迴地定義最優解的值。也就是找出狀態轉移方程。就是考慮,如何通過子問題的解,去求解原問題的解?
計算最優解的值,通常採用自底向上的方法。按問題規模由小到大,計算所有子問題,得到規模最大的,最原始問題的解。
利用計算出的資訊構造乙個最優解。
第十五章動態規劃之「矩陣鏈乘法」
裝配線排程與矩陣鏈乘法是很典型的動態規劃的兩個例子。關於這倆例子對於理解動態規劃的作用稍後補上。這個程式的時間複雜度為 n 3 這個可以通過替換法證明。輸出最優加括號的 對於理解遞迴很有幫助,蹭蹭蹭,先往回跑,路上什麼也不幹,跑到頭再跑回來,把該幹的都幹了,先自頂向下,再自底向上。如下 includ...
演算法導論第十五章習題15 4 2
不適用陣列b就能實現lcs結果的列印,如下 lcs include includeusing namespace std 改進的lcs演算法,不使用陣列b便可列印出結果 void lcs lengthc string x,string y,int c 100 for i 1 i n i 遍歷兩個字串...
第十五章動態規劃之「最優二叉查詢樹」
本書從文字翻譯的案例切入,假設把英文翻譯為法文,每個英文單詞為關鍵字,其對應法文為衛星資料。用二叉查詢樹儲存,該怎麼設計這個查詢樹。即使是紅黑樹,查詢的時間複雜度也為o lgn 即樹的深度。但是因為文章中某個單詞出現的頻率不同,所以可能有些頻率很高的單詞比如the的深度可能很深,而不常見的aha的深...