dp動態規劃分類詳解
轉自:http://blog.csdn.NET/cc_again/article/details/25866971
?
動態規劃一直是ACM競賽中的重點,同時又是難點,因為該算法時間效率高,代碼量少,多元性強,主要考察思維能力、建模抽象能力、靈活度。
?
******************************************************************************************
動態規劃(英語:Dynamic programming,DP)是一種在數學、計算機科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。 動態規劃常常適用于有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少于樸素解法。
動態規劃背后的基本思想非常簡單。大致上,若要解一個給定問題,我們需要解其不同部分(即子問題),再合并子問題的解以得出原問題的解。 通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量: 一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次需要同一個子問題解之時直接查表。 這種做法在重復子問題的數目關于輸入的規模呈指數增長時特別有用。
動態規劃問題滿足三大重要性質
最優子結構性質:如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃算法解決問題提供了重要線索。
子問題重疊性質:子問題重疊性質是指在用遞歸算法自頂向下對問題進行求解時,每次產生的子問題并不總是新問題,有些子問題會被重復計算多次。動態規劃算法正是利用了這種子問題的重疊性質,對每一個子問題只計算一次,然后將其計算結果保存在一個表格中,當再次需要計算已經計算過的子問題時,只是在表格中簡單地查看一下結果,從而獲得較高的效率。
無后效性:將各階段按照一定的次序排列好之后,對于某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態。換句話說,每個狀態都是過去歷史的一個完整總結。這就是無后向性,又稱為無后效性。
********************************************************************************************
?
動態規劃分類有很多劃分方法,網上有很多是按照狀態來分,分為一維、二維、區間、樹形等等。我覺得還是按功能即解決的問題的類型以及難易程度來分比較好,下面按照我自己的理解和歸納,把動態規劃的分類如下:
一、簡單基礎dp
這類dp主要是一些狀態比較容易表示,轉移方程比較好想,問題比較基本常見的。主要包括遞推、背包、LIS(最長遞增序列),LCS(最長公共子序列),下面針對這幾種類型,推薦一下比較好的學習資料和題目。
1、遞推:
遞推一般形式比較單一,從前往后,分類枚舉就行。
簡單:
hdu 2084 數塔?簡單從上往下遞推
hdu 2018 母牛的故事?簡單遞推計數
hdu 2044 一只小蜜蜂...?簡單遞推計數(Fibonacci)
hdu 2041 超級樓梯?Fibonacci
hdu 2050 折線分割平面?找遞推公式
推薦:
CF 429B B.Working out?四個角遞推
zoj 3747 Attack on Titans?帶限制條件的計數遞推dp
uva 10328 Coin Toss?同上題
hdu 4747 Mex?
hdu 4489 The King's Ups and Downs
hdu 4054 Number String
2、背包
經典的背包九講:http://love-oriented.com/pack/
推薦博客:http://blog.csdn.net/woshi250hua/article/details/7636866
主要有0-1背包、完全背包、分組背包、多重背包。
簡單:
hdu 2955 Robberies?01背包
hdu 1864 最大報銷額?01背包
hdu 2602 Bone Collector?01背包
hdu 2844 Coins?多重背包
hdu 2159 FATE?完全背包
推薦:
woj 1537 A Stone-I? 轉化成背包
woj 1538 B Stone-II?轉化成背包
poj 1170 Shopping Offers?狀壓+背包
zoj 3769 Diablo III?帶限制條件的背包
zoj 3638 Fruit Ninja?背包的轉化成組合數學
hdu 3092 Least common multiple?轉化成完全背包問題
poj 1015 Jury Compromise?擴大區間+輸出路徑
poj 1112 Team Them UP?圖論+背包
3、LIS
最長遞增子序列,樸素的是o(n^2)算法,二分下可以寫成o(nlgn):維護一個當前最優的遞增序列——找到恰好大于它更新
簡單:
hdu 1003 Max Sum
hdu 1087 Super Jumping!
推薦:
uva 10635 Prince and Princess?LCS轉化成LIS
hdu 4352 XHXJ's LIS 數位dp+LIS思想
srm div2 1000??狀態壓縮+LIS
poj 1239 Increasing Sequence?兩次dp
4、LCS
最長公共子序列,通常o(n^2)的算法
hdu 1503 Advanced Fruits
hdu 1159 Common Subsequence
uva 111 History Grading?要先排個序
poj 1080 Human Gene Functions
?
二、區間dp
推薦博客:http://blog.csdn.net/woshi250hua/article/details/7969225
區間dp,一般是枚舉區間,把區間分成左右兩部分,然后求出左右區間再合并。
poj 1141 Brackets Sequence?括號匹配并輸出方案
hdu 4745 Two Rabbits?轉化成求回文串?
zoj 3541 The Last Puzzle??貪心+區間dp
poj 2955 Brackets
hdu 4283 You Are the One? 常見寫法
hdu 2476 String Printer?
zoj 3537 Cake
CF 149D Coloring Brackets
zoj 3469 Food Delivery
?
三、樹形dp
比較好的博客:http://blog.csdn.net/woshi250hua/article/details/7644959
一篇論文:http://doc.baidu.com/view/f3b19d0b79563c1ec5da710e.html
樹形dp是建立在樹這種數據結構上的dp,一般狀態比較好想,通過dfs維護從根到葉子或從葉子到根的狀態轉移。
hdu 4123 Bob's Race?二分+樹形dp+單調隊列
hdu 4514? 求樹的直徑
poj 1655 Balancing Act?
hdu 4714 Tree2Cycle?思維
hdu 4616 Game
hdu 4126 Genghis Kehan the Conqueror?MST+樹形dp?比較經典
hdu 4756 Install Air Conditioning?MST+樹形dp 同上
hdu 3660 Alice and Bob's Trip?有點像對抗搜索
CF 337D Book of Evil??樹直徑的思想 思維
hdu 2196 Computer?搜兩遍
?
四、數位dp
推薦一篇論文:http://wenku.baidu.com/view/d2414ffe04a1b0717fd5dda8.html
數位dp,主要用來解決統計滿足某類特殊關系或有某些特點的區間內的數的個數,它是按位來進行計數統計的,可以保存子狀態,速度較快。數位dp做多了后,套路基本上都差不多,關鍵把要保存的狀態給抽象出來,保存下來。
hdu 2089 不要62?簡單數位dp
hdu 3709 Balanced Number?比較簡單
CF 401D Roman and Numbers?狀壓+數位dp
hdu 4398 X mod f(x)?把模數加進狀態里面
hdu 4734 F(x)??簡單數位dp
hdu 3693 Math teacher's homework?思維變換的數位dp
hdu 4352 XHXJ's LIS 數位dp+LIS思想
CF 55D Beautiful Numbers? 比較巧妙的數位dp
hdu 3565 Bi-peak Numbers?比較難想
CF 258B Little Elephant and Elections?數位dp+組合數學+逆元
?
五、概率(期望) dp
推薦博客:http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html
推薦博客:http://blog.csdn.net/woshi250hua/article/details/7912049
推薦論文:
《走進概率的世界》
《淺析競賽中一類數學期望問題的解決方法》
《有關概率和期望問題的研究》
一般來說概率正著推,期望逆著推。有環的一般要用到高斯消元解方程。期望可以分解成多個子期望的加權和,權為子期望發生的概率,即?E(aA+bB+...)?=?aE(A)?+?bE(B)?+...?
ural 1776 Anniversiry Firework?比較基礎
hdu 4418 Time travel??比較經典BFS+概率dp+高斯消元
hdu 4586 Play the Dice?推公式比較水
hdu 4487 Maximum Random Walk?
jobdu 1546 迷宮問題?高斯消元+概率dp+BFS預處理
hdu 3853 LOOPS?簡單概率dp
hdu 4405 Aeroplane chess?簡單概率dp,比較直接
hdu 4089 Activation?比較經典
poj 2096 Collecting Bugs?題目比較難讀懂
zoj 3640 Help me Escape?從后往前,比較簡單
hdu 4034 Maze?經典好題,借助樹的概率dp
hdu 4336 Card Collector?狀態壓縮+概率dp
hdu 4326 Game??這個題狀態有點難抽象
?
六、狀態壓縮dp
這類問題有TSP、插頭dp等。
推薦論文:http://wenku.baidu.com/view/ce445e4f767f5acfa1c7cd51.html
推薦博客:http://blog.csdn.net/sf____/article/details/15026397
推薦博客:http://www.notonlysuccess.com/index.php/plug_dp/
hdu 1693 Eat the Trees ?插頭dp
hdu 4568 Hunter?最短路+TSP
hdu 4539??插頭dp
hdu 4529 狀壓dp
poj 1185 炮兵陣地
poj 2411 Mandriann's Dream?輪廓線dp
hdu 3811 Permutation
poj 1038
poj 2441
hdu 2167
hdu 4026
hdu 4281
?
七、數據結構優化的dp
有時盡管狀態找好了,轉移方程的想好了,但時間復雜度比較大,需要用數據結構進行優化。常見的優化有二進制優化、單調隊列優化、斜率優化、四邊形不等式優化等。
1、二進制優化
主要是優化背包問題,背包九講里面有介紹,比較簡單,這里只附上幾道題目。
hdu 1059 Diving?
hdu 1171 Big Event in Hdu
poj 1048 Follow My Magic
2、單調隊列優化
推薦論文:http://wenku.baidu.com/view/4d23b4d128ea81c758f578ae.html
推薦博客:http://www.cnblogs.com/neverforget/archive/2011/10/13/ll.html
hdu 3401 Trade??
poj 3245 Sequece Partitioning?二分+單調隊列優化
3、斜率優化
推薦論文:用單調性優化動態規劃
推薦博客:http://www.cnblogs.com/ronaflx/archive/2011/02/05/1949278.html
hdu 3507 Print Article
poj 1260 Pearls
hdu 2829 Lawrence
hdu 2993 Max Average Problem
4、四邊形不等式優化
推薦博客:http://www.cnblogs.com/ronaflx/archive/2011/03/30/1999764.html
推薦博客:http://www.cnblogs.com/zxndgv/archive/2011/08/02/2125242.html
hdu 2952 Counting Sheep
poj 1160 Post Office
hdu 3480 Division
hdu 3516 Tree Construction
hdu 2829 Lawrence