動態規劃(DP)演算法

2021-09-06 20:16:30 字數 2011 閱讀 3838

動態規劃(dynamic programming, dp),在選擇dp演算法的時候,往往是在決策問題上。動態規劃先解決子問題,再逐步解決大問題。

一般情況下,我們能將問題抽象出來,並且問題滿足無後效性,滿足最優子結構,並且能明確地找出狀態轉移方程的話,dp是很好的選擇。

①無後效性指的是,只要得出了當前狀態,而不用管這個狀態怎麼來的,也就是說之前的狀態已經用不著了。如果抽象出的狀態有後效性,只用把這個值加入到狀態的表示中;

②最優子結構(自下而上):在決策問題中,如果,當前問題可以拆分為多個子問題,並且依賴於這些子問題,那麼我們稱為此問題符合子結構。而若當前狀態可以由某個階段的某個或某些狀態直接得到,那麼就符合最優子結構。

③重疊子問題(自上而下):動態規劃演算法總是充分利用重疊子問題,通過每個子問題只解一次,把解儲存在乙個需要時就可以檢視的表中,每次查表的時間為常數,如備忘錄的遞迴方法、斐波那契數列的遞迴就是個很好的例子。

④狀態轉移:這個概念比較簡單,在抽象出上述兩點的的狀態表示後,每種狀態之間轉移時值或者引數的變化。

揹包問題:假設你是乙個小偷,揹著乙個可裝4磅東西的揹包。可偷竊的商品有如下3件,為了讓盜竊的商品價值最高,該選擇哪些商品?

對於揹包問題,先解決小揹包(子揹包)問題,在逐步解決原來的問題。

每個動態規劃演算法都從乙個網格開始,網格的各行為商品,各列為不同容量(1~4磅)的揹包。揹包問題的網格(4*4)如下:物品1

234吉他(1磅,$1500)

音響(4磅,$3000)

膝上型電腦(3磅,$2000)

第乙個單元格表示揹包的容量為1磅,而結他的重量也是1磅,這意味著它能裝入揹包。

這是第一行,只有吉他可供選擇。換言之,你假裝現在還沒法盜竊其他兩件商品。物品1

234吉他(1磅,$1500)

$1500

$1500

$1500

$1500

音響(4磅,$3000)

膝上型電腦(3磅,$2000)

高亮處表示:如果有乙個容量為4磅的揹包,可在其中裝入的商品的最大價值為1500美元。

這是第二行,可偷的商品有結他和音響。在每一行,可偷的商品都為當前行的商品以及之前各行的商品。因此,還不能偷膝上型電腦,而只能偷音響和結他。

前3列都裝不下音響(4磅),若揹包容量為4磅(第4列),原來的最大值為1500磅,但如果裝入音響而不是吉他,價值將為3000磅。所以丟棄吉他,裝入音響。物品1

234吉他(1磅,$1500)

$1500

$1500

$1500

$1500

音響(4磅,$3000)

$1500

$1500

$1500

$3000

膝上型電腦(3磅,$2000) 物品

1234

吉他(1磅,$1500)

$1500

$1500

$1500

$1500

音響(4磅,$3000)

$1500

$1500

$1500

$3000

膝上型電腦(3磅,$2000)

$1500

$1500

$2000

$2000 + $1500

前2列都裝不下膝上型電腦(3磅)。

對於容量為3磅的揹包,原來的最大價值為1500磅,但現在可選擇盜竊2000磅的膝上型電腦而不是吉他,這樣新的最大價值將為2000磅。

對於容量為4磅的揹包,當前的最大價值為3000美元。可以不偷音響而偷膝上型電腦,但只值2000美元,價值沒有原來高。但是膝上型電腦只有3磅,揹包還有1磅沒用。

在1磅的容量中,可裝入商品的最大價值在之前計算過(第1列的最後1行)。所以最終為 2000+1500 = 3500磅。

這就是為何要計算小揹包可裝入商品的最大價值,即當餘下了空間時,可根據這些子問題的答案來確定餘下的空間可裝入哪些商品。

**表示:

cell [i][j] = max(1, 2)

31/100. palindromic substrings

演算法之動態規劃DP

若要解乙個給定問題,我們可以解其不同部分 即子問題 再根據子問題的解以得出原問題的解。通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量 一旦某個給定子問題的解已經算出,則將其記憶化儲存,以便下次需要同乙個子問題解之時直接查表。這種做法在重複子問題的數目關於輸入的規模呈...

動態規劃演算法(DP)

動態規劃演算法採用分治演算法的思想,將原問題分成若干個子問題,然後分別求解各個子問題,最後將子問題的解組合起來得到原問題的解。分治演算法遞迴地求解各個子問題,可能重複求解某些子問題。與分治演算法不同的是,動態規劃演算法不是遞迴地求解各個子問題,它是從簡單問題的解入手,逐步求解,直至求解出原問題。動態...

演算法筆記之動態規劃 DP

寫在前面 因為演算法課上駱老師講的是真的好,所以對動態規劃還是比較熟悉的。總結來說就是自底向上求解,主要在於dp轉移方程的分析,然後構造dp陣列進行填表即可,有時可能需要注意儲存求解路徑。動態規劃 簡單分析乙個最大連續子串行之和問題 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k...