動態規劃、分治法和貪心法都是利用求解子問題,而後利用子問題求解更上層問題,最終獲得全域性解決方案的方法。
但是三者的應用場景和性質卻存在著極大的不同:
1.分治法
很容易與動態規劃問題混淆,但兩者卻有著本質上的差異。
分治法採用的是遞迴的思想來求解問題,兩個分解的子問題獨立求解,其之間無任何的重疊。而上一層問題只需要對兩個子問題進行一定的merge即可得到答案。即s(t)= s(sub1)+s(sub2),但是s(sub1)和s(sub2)之間(看子問題)無任何重疊。
典型應用:
a. 並規排序。
b. 晶元診斷。(前提是對的晶元》錯誤的晶元)
2. 貪心法
可以定義為 s(t)= s(t-1) + selection acoording to certain criteria。
同樣其使用了類似迭代子問題的求解方式,逐步求得全域性的最優答案。而其只有乙個s(t-1),故不存在重疊求解子問題的情況。
3. 動態規劃方法
該種方法較為複雜,但十分有用和高效,其核心性質是當前當前問題的答案s(t),並不能單獨由s(t-1)求得。還有可能需要使用到s(1)...s(t-1)。具體需要使用到那些,是由問題本身的性質所決定的(常常是乙個約束,或變相的約束)。
典型的轉移方程:
file:///users/yangjingwei/desktop/screen%20shot%202014-11-01%20at%2010.46.08%20am.png
動態規劃 分治 貪心 遞迴
一言以蔽之 dp 和分治 之間的區別就在於是否有重疊子問題 如果有那就應該dp 否則就應該分治。當然如果可以每一步都產生最優解那麼就不必dp了,貪心演算法就可以了.而遞迴只是一種實現演算法的方法.例子 下面分別用 dp,dc 分治法 貪心來做 leetcode 514.自由之路 golang 如下 ...
經典演算法之動態規劃 分治 和貪心
1 分治 分治 即分而治之 把乙個複雜的問題分成多個相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。適用場景 二分搜尋 歸併排序 快速排序 大整數乘法 第k小元素 最近點對 快速傅利葉變換等。2 動態規劃 動態規劃法也是把問題一層一層地...
貪婪演算法 動態規劃 分治法比較
1,貪婪演算法 一步步走,每走一步都是當前最優的。使用要求 無後向性,比如n個活動安排,只要安排了某個活動,那麼後面活動怎麼安排和前面的選擇無關。注 每一步都是選最棒的,那麼這個最棒是怎麼定義的?什麼標準 看下面這個例子 貪心法標準的選擇 設有n個正整數,將它們連線成一排,組成乙個最大的多位整數。例...