1. 程式人生 > 其它 >動態規劃 VS 貪心演算法

動態規劃 VS 貪心演算法

分治:將問題劃分為互不相交的子問題遞迴求解。 動規:應用於子問題重疊的情況。求解過程中將子問題的解記錄在表格中。 動態規劃主要用於求解最優化問題。 求解步驟:
  1. 找到最優子結構。最優子結構性質:問題的最優解由相關的子問題的最優解組合而成,而這些子問題可以獨立求解。
  2. 遞迴地定義最優解的值。
  3. 自底向上地計算最優解的值。
  4. 得到最優解。
ps: * 子問題可以與原問題求解形式一樣但規模更小。 * 自頂向下的遞迴方法:總是重複求解相同的子問題。 * 動態規劃方法:仔細安排求解順序,對每個子問題只求解一次,並將結果儲存。 * 動態規劃方法有兩種等價實現:1. 帶備忘的自頂向下法(遞迴求解)。2. 自底向上法(迴圈求解)。pps: 第一種其實就是記憶化搜尋。 * 子結構要求子問題無關的。 子問題圖
可以看作自頂向下遞迴呼叫樹的“簡化版”。即原遞迴呼叫樹種的相同子問題合併為子問題圖中的單一節點。相同的所有邊都從父節點指向子節點。 當思考動態規劃問題時,要弄清楚涉及的子問題及子問題之間的依賴關係。 用點表示子問題,用有向邊<x, y>表示求解子問題 x 的最優解需要用到子問題 y 的最優解。 自底向上動態規劃演算法是按“逆拓撲序”來處理子問題圖中的頂點。即:對於任何子問題,只有它以來的所有子問題均已求解完成,才會求解它。 適合用動態規劃方法求解的最優化問題 1. 包含最優子結構。 2. 子問題重疊。 發掘最優子結構的通用模式 1.證明問題的最優解的第一個組成部分是做出一個選擇。做出這個選擇會產生一個或多個待解決的子問題。 2.對於給定問題,在其可能的第一步選擇中,假定已知哪種選擇會得到最優解。 3.給定可獲得最優解的選擇後,你確定這次選擇會產生哪些子問題。 4.反證法可證明:作為構成原問題最優解的組成部分,每個子問題的解就是它本身的最優解。 對於不同問題,最優子結構的不同體現在: 1.原問題的最優解中數涉及多少個子問題,以及 2.在確定最優解使用哪些子問題時,需要考慮多少種選擇。 動態規劃方法中,通常自底向上地使用最優子結構。即:先求子問題的最優解,然後求原問題的最優解。在求解原問題過程中,需要在涉及的子問題中做出選擇,選擇能得到原問題最優解的子問題。
貪心 VS 動態規劃 貪心:先做出貪心的選擇得到子問題(當時看是最優的選擇),然後求解子問題。(先選擇再求解子問題) 動規:求出每個子問題的最優解,然後選擇能得到原問題最優解的子問題。(先求解子問題再選擇) 子問題無關 VS 重疊子問題 子問題無關:最優子結構中要求子問題無關,即:每個子問題可以獨立求解;同一個原問題的一個子問題的解不影響另一個子問題的解。 重疊子問題:向下求解原問題的最優解的過程中,會重複求解某同一個子問題。即:求解某個子問題的子子問題與其他子問題的子子問題一樣。 e.g: