今天老師口胡了一波動歸,如果有其他人發了一篇差不多的,一定是我同學!
範圍:適於解決多階段、多決策、最優解(求方法數)問題
當前階段 ,選最優(每次選取能取到的最優值,從而得到乙個區域性最優值) 。例題:潛水
分而治之 ,也就是分->治
例題(或用法):快排 ,歸併排序
當前階段, 記錄 所有的最優 (也就是常說的空間換時間)
由於分部分的時候,重合部分經常出現,就會出現大量重複的遞迴呼叫,然而用了記憶化搜尋來解決,可使動歸 進一步 轉換為遞推。
動態規劃的兩個必要條件:
1)無後效性:當前的最優解與後面無關;
2)最優子結構:每次都要保證最有值;
看到這兩個條件滿足就基本確定是動態規劃了;
動歸解題步驟:
1)確定能用動態規劃解決;
2)劃分階段:時間,空間,順序;(不同階段效率不同,具體題目具體分析)
拓撲排序*也是階段劃分
floyd 的k迴圈
3)設定狀態:前i階段的******的最優值是什麼
設定f[i]([j]),表示某個狀態的最優值
洛谷 2519,為海亮題庫(hloj)407加強版;
狀態是幾維,迴圈也就是幾重迴圈
區間類:從第i個到第j個的最優值;
4)建立狀態轉移方程
當前的狀態(最優值、方案數)有前面那些狀態推導出;
繼續加迴圈;
例:零一揹包:
f[i][j]狀態表示 前i個物品佔據容量為j的揹包的最優值
故轉移方程為
f[i][j]=max(f[i-1][j](0,即不取),f[i-1][j-w[i]]+v[i](1,表示取));
*拓撲排序定義:拓撲排序順序就是在圖上做動態規劃的階段劃分;(滿足條件時)
動態規劃分類的最終目的,是不分類。
1) 資源分配
hloj411機械分配: f[i][j] 狀態表示前i個公司 分配 j 臺機器
412馬棚:狀態:前i匹馬分j個馬棚
使用三重迴圈實現;
延伸:輸出方案,是noip裡也會考察的
2) 揹包
a ) 0/1 揹包:
f[i][j]= max(f[i-1][j],f[i-1][j-c[i]]+w[i])
不要要第i個物品
用一維實現狀態 : f[j] i迴圈(v...c[i]) 倒著迴圈;
ps:零一揹包是其他所有揹包類問題及變形的基礎,所以一定要掌握,詳見揹包九講(
b)完全揹包
f[i][j]= max(f[i-1][j],f[i][j-c[i]]+w[i])
不要要第i個物品
一維狀態 : f[j] i迴圈(c[i]...v) 正著迴圈;
ps:觀察零一揹包與完全揹包二維狀態、一維狀態的分別不同之處並思考原因。
c)多重揹包
每個物品有多個,第i個物品有k個, 1倍,2倍,3倍……k倍
二進位制優化 log2(k)
13= 1 12
2 10
4 6
6d)二維體積揹包
f[i][j][k]設定三維的狀態,其實與零一沒什麼區別,只要再加上一層迴圈而已,轉移方程也類似
同時也可以壓縮為二維的:
f[j][k]=max(f[j][k],f[j-w1[i]][k-w2[i]]+v[i]);
e)分組:
可以將每組都合併成乙個物品,再按照零一來做;
f)有依賴 (樹形動態規劃):
這個。。。已經不在今天的範圍之內了。。。
若是想學習還是另請高明吧。
ps:揹包類問題是動態規劃的重點考點,熟悉掌握才能應對考場上的各種變形、結合的揹包問題。
3) 雙程序:
兩個程序,用i、j分別指示;通過兩個程序之間的關係來求解;
例題:最長公共子串行、構建雙塔等;
4) 區間類
區間問題的狀態設定、轉移方程都不同於其他的dp,
f[i][j]表示從第i個 到 第 j個 的最優值
f[i][j];
階段 : 區間長度
for (int p=0;p<=n;p++) //區間長度
for (int i=1;i<=n;i++)//起點位置
環狀的區間類: 長度變兩倍,依次去做
5) 二維 由線性變成了平面
呵呵,我還沒學呢;
例題:農田個數、創意吃魚;
聽說都是有意思的題;
呼,就是這樣,劉老師口胡一波的東西我加了一些改動就放上來了。。。。
YTU3141 動態規劃高階題目之神奇的口袋
時間限制 1 sec 記憶體限制 64 mb 提交 80 解決 49 提交 狀態 討論版 命題人 lyh 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些...
動態規劃 保留重複元素的LCS 1045
這題也可以用lis求解。lis解題報告 動態規劃 對輸入進行hash處理的lis 1045 普通lcs是必須完全匹配的,所以狀態轉移方程式 末端匹配到時 但是本題連續的序列是可以累加的。所以狀態狀態轉移方程式 末端匹配到時 兩個狀態的最大值 1就是dp i j 的值 ac include inclu...
最長不重複子序列(DP hash 動態規劃)
leetcode longest substring without repeating characters class solution public int lengthoflongestsubstring string s int b 0,rele 0,i 0 b back mark,i f...