一言以蔽之:
dp 和分治 之間的區別就在於是否有重疊子問題 ,如果有那就應該dp 否則就應該分治。 當然如果可以每一步都產生最優解那麼就不必dp了, 貪心演算法就可以了. 而遞迴只是一種實現演算法的方法.
例子
下面分別用 dp, dc(分治法), 貪心來做 leetcode 514. 自由之路
golang **如下:
package main
import (
"fmt"
"math"
)func main()
// ********************==== 分治法 ******************************===
// time limit
// m:ring n:key
// m 的n次方
func findrotatestepsdc(ring string, key string) int
// 從ring的s位置, key的i位置 所需要的最小值
func findmin(ring string, s int, key string, i int, l int)int
min := math.maxint32
temp := math.maxint32
for j := range ring}}
return min
}// ********************==== dp *************************==
// ac
func findrotatestepsdp(ring string, key string) int else}}
}ret := math.maxint32
for i :=0; i <= m; i++
return ret
}// 要去dp(0, j) 位置 所需要的最小值
func calc0(i int, j int, m int)int
// 要去 dp(i+1, j) 位置 所需的最小值
func calcmin(dp [100]int, i int, j int, ringl int) int
return ret
}// ******************************==== greedy ******************************=
// 不能ac 因為不滿足貪心選擇
func findrotatestepsgreedy(ring string, key string) int
func findrotatestepsgreedyutil(ring string, start int, key string, i int, l int) int
count, nstart := findgreedy(ring, start, key, i)
return count + findrotatestepsgreedyutil(ring, nstart, key, i+1, l)
}func findgreedy(ring string, start int, key string, i int)(int, int)}}
return c, ret
}// ----------------- common func ----------------------
// a,b 最小值
func min(a int, b int) int
return b
}// ring中 s 到mid 的最小距離
func calc(s int, e int, l int) intelse
}
分治 遞迴 動態規劃 貪心演算法區別
三者之間沒有根本區別,關鍵看有無最優的子結構。共性 找到重複子問題 差異性 動態規劃尋找最優子結構,中間可以淘汰次優解 動態規劃是尋找區域性,全域性最優解 貪心演算法是找區域性最優解,不一定得到全域性最優解 回顧下遞迴四步驟 terminator process drill dowm restore...
經典演算法之動態規劃 分治 和貪心
1 分治 分治 即分而治之 把乙個複雜的問題分成多個相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。適用場景 二分搜尋 歸併排序 快速排序 大整數乘法 第k小元素 最近點對 快速傅利葉變換等。2 動態規劃 動態規劃法也是把問題一層一層地...
理解動態規劃 分治法和貪心法
動態規劃 分治法和貪心法都是利用求解子問題,而後利用子問題求解更上層問題,最終獲得全域性解決方案的方法。但是三者的應用場景和性質卻存在著極大的不同 1.分治法 很容易與動態規劃問題混淆,但兩者卻有著本質上的差異。分治法採用的是遞迴的思想來求解問題,兩個分解的子問題獨立求解,其之間無任何的重疊。而上一...