動態規劃是乙個很難的演算法,以我近些日子做的動態規劃的題目來看,十個裡面有八個我是想不出來是怎麼做的,因為有許多問題需要思考它的遞推式,而我那麼笨,就是找不到解決此問題的方法,所以我要系統地理論性地將《演算法導論》中的動態規劃的分析方法整理出來,以便以後做題時能夠合理分析此問題。
它應用於子問題重疊的情況,即不同的子問題具有公共的子子問題(子問題的求解是遞迴進行的,將其劃分為更小的子子問題)。動態規劃演算法對每個子子問題只求解一次,將其儲存在乙個**中,這樣以後就無需再重新求解已經解決好的子子問題。
動態規劃求解的問題:最優化問題,比如什麼最長公共子串行,什麼最長遞增子串行,最多巢狀矩陣等等等等,裡面都有乙個「最」字,這類問題雖然有很多其他可行的解,但是我們需要乙個最優解(這裡的乙個最優解不是唯一乙個,而是符合條件的乙個即可)。
步驟1~3是動態規劃演算法求解問題的基礎,而如果需要構造出乙個最優解,就需要步驟4了。
即上乙個步驟中的步驟3,通常採用自底向上的方法,其實還有自頂向下的方法。
為什麼經常採用「自底向上」的方法呢?
因為雖然兩種方法的漸進執行時間相同,但是在某些特殊情況下,自頂向下方法並未真正遞迴地考察所有可能的子問題。
最優子結構:
在發掘最優子結構性質的過程中,實際上遵循了如下的通用模式:
對於不同問題領域,最優子結構的不同體現在兩個方面:
在動態規劃方法中,我們通常自底向上地使用最優子結構。首先先求得子問題的最優解,然後再求原問題的最優解。在求解原問題過程中,我們需要在涉及的子問題中做出選擇,選出能得到原問題最優解的子問題。原問題最優解的代價通常就是子問題最優解的代價再加上由此選擇直接產生的代價。
演算法設計與分析 動態規劃
最大子段和問題 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。i.當所有整數均為負值時定義其最大子段和為0。所求的最優值為 i.例如,當 a1,a2,a7,a8 1,3,7,8,4,12,10,6 時,最大子段和為 bj是1到j位置的最大子段和 由bj的定義易知,當...
演算法設計與分析 動態規劃
分治技術的問題 子問題是相互獨立的 如果子問題不是相互獨立的,分治演算法將重複計算公共子空間,效率很低 提高效率的方法 從規模最小的子問題開始計算 用恰當資料結構儲存子問題的解,供以後查詢 確保每個子問題只求解一次 優化問題 給定一組約束條件和乙個代價函式,在解空間中搜尋具有最小或最大代價的優化解 ...
演算法分析 動態規劃
求解問題分為多個階段或多個子問題,然後按順序求解各個問題,最後乙個子問題就是初始問題的解。動態規劃 貪婪策略 遞推 儲存遞推結果 空間換取時間 基本要素 最優化子結構性質和重疊子問題性質 階段 把問題分為幾個相互聯絡的有順序的幾個環節,這些稱為階段。狀態 某一階段發出的位置稱為狀態。決策 從某一階段...