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