動態規劃 分治 貪心 遞迴

2021-08-25 14:32:29 字數 1872 閱讀 7822

一言以蔽之:

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.分治法 很容易與動態規劃問題混淆,但兩者卻有著本質上的差異。分治法採用的是遞迴的思想來求解問題,兩個分解的子問題獨立求解,其之間無任何的重疊。而上一...