動態規劃(附dp的相關習題)

動態規劃是對解的最優化問題的一種途徑、一種方法,而不是一種特殊的算法。動態規劃往往是針對一種最優化問題的,由於各種問題的性質不同,確定最優解的條件也互不相同。因而動態規劃對於不同的問題,有各具特色的解體方法,而不存在一種萬能的動態規劃算法,可以解決各種最優化問題。

一.多階段決策過程的最優化問題

這種把一個問題看作是一個前後關聯具有鏈狀結構的多階段過程就稱爲多階段決策過程,這種問題就成爲多階段決策問題。
初始狀態→│決策1│→│決策2│→…→│決策n│→結束狀態

動態規劃求解問題的特點

最優化原理:即子問題的局部最優解將導致整個問題的全局最優解,也就是說一個問題的最優解只取決於子問題的最優解。

無後效性原則:即某階段狀態一旦確定,就不受這個狀態以後決策的影響。也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關。

有重疊子問題:即子問題之間是不獨立的,一個子問題在下一階段決策中可能被多次使用到。(該性質並不是動態規劃適用的必要條件,但是如果沒有這條性質,動態規劃算法同其他算法相比就不具備優勢)

動態規劃問題的求解步驟

1.確定狀態集合
2.進行狀態劃分
3.求解狀態轉移方程

計算狀態轉移方程的方法

1.遞推法:遞推的關鍵是邊界和計算順序。在多數情況下,遞推法的時間複雜度是:狀態總數 * 每個狀態的決策個數 * 決策時間。
2.記憶化搜索:當採用記憶化搜索時,不必事先確定各個狀態的計算順序,但需要記錄每個狀態是否已經計算過。

動態規劃的相關的題目

1.線性dp

即爲線性空間上的簡單遞推,這是最基本的dp了
1)數字三角形問題
數字三角形
摘花生
最低通行費
方格取數
牧場物語
Worm

2)最長上升子序列問題
最長上升子序列(入門題)
怪盜基德的滑翔翼
Monkey and Banana
FatMouse’s Speed
反恐訓練營

3)最大子段和問題
Maximum sum
Functions again

4)其他
Tickets
Employment Planning
Milking Time
Jumping Cows
放蘋果
Sonya and Problem Wihtout a Legend
Long Path

2.揹包九講

1)01揹包問題(入門題)
2)完全揹包問題
3)多重揹包問題(+二進制優化)
4)混合揹包問題
5)二維費用的揹包問題
6)分組揹包問題

3.狀態壓縮DP

用二進制數來表示集合某些狀態,從而將狀態簡化
蒙德里安的夢想
最短Hamilton路徑

4.樹形DP

用樹來存儲與計算相關的狀態,樹形dp一般思維難度較小,但要習慣這一種思維方式
沒有上司的舞會(入門題)
Cell Phone Network

5.記憶化搜索

How many ways

現在的題目還比較少,也不是很全,以後會慢慢加題的(一起加油把)。

感悟:說實話,現在學動態規劃挺長時間了,做的題目也不少了,但是隻要是遇到了稍微拐個彎的題目我還是不會。不過多少也算是有了一些進步了。剛學動態規劃的時候,啥題也做不出來,就算是給我了狀態轉移方程我也寫不出代碼來。然後就開始瘋狂看題,看題解。看了很多動態規劃的題目,最終才理出來了一些頭緒,可以做一些簡單的dp問題了。
對於動態規劃問題,雖然對於不同的題目,動態規劃的方法也都不同,但是這些動態規劃的題還是也一定的共性的:動態規劃這個方法給我們提供了一個共同的出發點,我們可以從這個出發點出發去思考問題的答案,雖然終點和做題所走的道路各不相同。但動態規劃給這些題提供了共同的思考出發點。
對於動態規劃,我認爲還是要多懟時間,多做題,多思考(要多想 )。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章