本小節講述了兩點內容:
合適動態規劃演算法解決的最優化問題的兩個要素
備忘方法在動態規劃中的作用
最優子結構
乙個問題的最優解包含其子問題的最優解還有一點值得注意,同時還需要滿足子問題無關的特性:同乙個原問題的乙個子問題的解不影響另乙個子問題的解。
重疊子問題
某乙個子問題可能會被包含在多個問題中,被反覆求解。重構最優解
備忘錄常常不僅僅儲存子問題的代價,還需要儲存子問題最優解的選擇過程。
就像是在矩陣鏈中,我們不僅儲存了代價,還儲存了括號劃分點;
備忘由於動態規劃演算法解決的問題具有重疊子問題的性質,所以備忘機制儲存已經求解過的子問題的解,極大地降低了時空代價。
對於矩陣鏈乘法問題,下面兩種確定最優代價的方法哪種更高效?第一種方法是窮舉所有可能的括號化方案,對每種方案計算乘法運算次數;第二種方法是執行\(recursive-matrix-chain\)。證明你的結論。毫無疑問,第二種方法更高效。
對乙個\(16\)個元素的陣列,畫出\(2.3.1\)節中\(merge-sort\)過程執行的遞迴呼叫樹。解釋備忘技術為什麼對\(merge-sort\)這種分治演算法無效。因為沒有子問題重疊。
考慮矩陣鏈乘法問題的乙個變形:目標改為最大化矩陣序列括號化方案的標量乘法運算次數,而非最小化。此問題具有最優子結構嗎?具有最優子結構。
如前所述,使用動態規劃方法,我們首先求解子問題,然後選擇哪些子問題用來構造原問題的最優解。\(capulet\)教授認為,我們不必為了求原問題的最優解而總是求解出所有的子問題。她建議,在求矩陣鏈乘法問題的最優解時,我們總是可以在求解子問題之前選定\(a_ia_..a_j\)劃分位置\(a_k\)(選定的\(k\)使得\(p_p_k p_\)最小)。請找出乙個反例,證明這個貪心方法可能生成次優解。//todo
對\(15.1\)節的鋼條切割問題加入限制條件:假定對於每種鋼條長度\(i(i=1,2,...,n-1)\),最多允許切割出\(l_i\)段長度為\(i\)的鋼條。證明:\(15.1\)節所描述的最優子結構性質不再成立。子問題的最優解切割出的長度為\(i\)的鋼條數量可能超出\(l_i\)。
演算法導論 15 3 編輯距離
題目 思考 1 初始化 s 0,0 0 s i,0 i cost delete s 0,j j cost insert 2 遞推 3 最後的操作kill c i j min c m,n min c i,n cost kill 其中0 i include using namespace std 6種操...
演算法導論 隨機演算法
一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...
《演算法導論》 演算法導論2 2 1插入排序
2.1 插入排序。我們分析的第乙個演算法是插入排序演算法,輸入 n個數 a1,a2,a3,a4,a5,a6,a7 an 輸出 序列的乙個排列 即重新排序 a1 a2 a3 使a1 a2 a3 插入排序演算法的偽 是以乙個過程的形式給出的,稱為insertion sort,它的引數是乙個陣列。包括了n...