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 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...