動態規劃入門

2021-10-10 01:33:45 字數 3038 閱讀 7485

1、劃分階段

2、確定狀態和狀態變數

3、確定決策並寫出狀態轉移方程

4、尋找邊界條件

5、設計並實現程式

如題目的問法一般是三種方式:

1.求最大值/最小值

2.求可不可行

3.求方案總數

如果乙個問題是讓求出所有的方案和結果,則肯定不是使用動態規劃

動態規劃與分治法類似,都是把大問題拆分成小問題,通過尋找大問題與小問題的遞推關係,解決乙個個小問題,最終達到解決原問題的效果。但不同的是,分治法在子問題和子子問題等上被重複計算了很多次,而動態規劃則具有記憶性,通過填寫表把所有已經解決的子問題答案紀錄下來,在新問題裡需要用到的子問題可以直接提取,避免了重複計算,從而節約了時間,所以在問題滿足最優性原理之後,用動態規劃解決問題的核心就在於填表,表填寫完畢,最優解也就找到。

f[i][j]表示目前考慮到了第i個數,子串行中最後乙個數是j的最長上公升序列長度,考慮f(i)是否比f(i-1)大

1、階段:i

2、狀態:j

3、決策:選還是不選

4、策略:上公升的

5、狀態轉移方程

例如:listx = [1,5,3,4,8]

step1、設計狀態

記以f(x)為以listx結尾的最長子序列長度,最長子序列長度就是max(f(x))。

如:f(1) = 1

f(2) = 2

f(3) = 2

f(4) = 3

f(5) = 4

step2、如何推導f(x)

考慮每乙個比x小的p,如果x>p,那麼f(x) = f§ + 1,找到其中最大的(例如8,比1、5、3、4都大,不能比較1個,要所有的都比較一下,)

f(1) = 1

f(2) = 2 = max(f(1)+1,f(2)=1)

f(3) = 2 = max(f(1)+1, f(3)>f(2)不比較,f(3)=1)

f(4) = 3 = max(f(1)+1, f(2)不比較,f(3)+1, f(4)=1)

f(5) = 4 = max(f(1)+1, f(2)+1,f(3)+1,f(4)+1)

step3、狀態轉移方程

f(x)=max(f§)+1;條件:p最優子結構

大問題可以由小問題推出來,大問題與小問題求解思路一致。

子問題的區域性最優解會形成整個問題的全域性最優解。

無後效性原則

一旦f(n)確定,後續我們直接呼叫它的值就可以,而不用關心它是怎麼過來的。

如:求f(5)的時候,我只是直接去f(1)、f(2)、f(3)、f(4)的值,不用計算如何來的,之前已經計算過了。

正推:從初始狀態開始,通過對中間階段的決策的選擇,達到結束的狀態。也稱為遞推。

倒推:從結束狀態開始,通過中間階段的決策的選擇,達到開始狀態。也稱為記憶化搜尋。

nums =[1

,5,3

,4,8

]dp =[1

]*len(nums)

for i in

range

(len

(nums)):

for j in

range

(i):

if nums[i]

> nums[j]

: dp[i]

=max

(dp[j]+1

,dp[i]

)print

(max

(dp)

)

問題描述

有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

i 1 2 3 4

w 2 3 4 5

v 3 4 5 6

過程

step1、把揹包問題抽象化

xi 取0或1,表示第 i 個物品選或不選

vi表示第 i 個物品的價值,

wi表示第 i 個物品的體積(重量);

step2、建立模型,即求max(v1x1+v2x2+…+vnxn);

step3、約束條件,w1x1+w2x2+…+wnxnjj>=w(i) v(i,j)=max{ v(i-1,j),v(i-1,j-w(i))+v(i) }

def

bag(number, capacity,w, v)

: dp =[[

0for _ in

range

(capacity+1)

]for _ in

range

(number+1)

]for i in

range(1

,number+1)

:# 遍歷每乙個物品

for j in

range(1

,capacity+1)

:# 遍歷包的容量

if j < w[i]

:# 說明裝不下

dp[i]

[j]= dp[i-1]

[j]# 等於上乙個物品

else

: dp[i]

[j]=

max(dp[i-1]

[j], dp[i-1]

[j-w[i]

]+ v[i]

)# dp[i-1][j-w[i]]是前i-1個物品的最優解

return dp[-1

][-1

]number =

4capacity =8w=

[0,2

,3,4

,5]# 如果不從0開始,迴圈的時候,i和j就需要v=[

0,3,

4,5,

6]res = bag(number, capacity,w, v)

print

(res)

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...