【DP專輯】ACM動態規劃總結

kewlgrl發表於2016-04-22

動態規劃一直是ACM競賽中的重點,同時又是難點,因為該演算法時間效率高,程式碼量少,多元性強,主要考察思維能力、建模抽象能力、靈活度。

本人動態規劃部落格地址:http://blog.csdn.net/cc_again/article/category/1261899

******************************************************************************************

動態規劃英語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 擴大區間+輸出路徑

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 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


六、狀態壓縮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 4568 Hunter 最短路+TSP

hdu 4539  插頭dp

hdu 4529 狀壓dp

poj 1185 炮兵陣地

hdu 3811 Permutation

poj 2411 Mandriann's Dream

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


存下來學習用~

轉載請註明出處,謝謝。   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日

相關文章