1. 程式人生 > >動態規劃總結及題目推薦

動態規劃總結及題目推薦

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

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

動態規劃英語Dynamic programming,DP)是一種在數學電腦科學經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。 動態規劃常常適用於有重疊子問題最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。

動態規劃背後的基本思想非常簡單。大致上,若要解一個給定問題,我們需要解其不同部分(即子問題),再合併子問題的解以得出原問題的解。 通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量: 一旦某個給定子問題的解已經算出,則將其

記憶化儲存,以便下次需要同一個子問題解之時直接查表。 這種做法在重複子問題的數目關於輸入的規模呈指數增長時特別有用。

動態規劃問題滿足三大重要性質

最優子結構性質:如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃演算法解決問題提供了重要線索。

子問題重疊性質:子問題重疊性質是指在用遞迴演算法自頂向下對問題進行求解時,每次產生的子問題並不總是新問題,有些子問題會被重複計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每一個子問題只計算一次,然後將其計算結果儲存在一個表格中,當再次需要計算已經計算過的子問題時,只是在表格中簡單地檢視一下結果,從而獲得較高的效率。

無後效性將各階段按照一定的次序排列好之後,對於某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態。換句話說,每個狀態都是過去歷史的一個完整總結。這就是無後向性,又稱為無後效性。

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

動態規劃分類有很多劃分方法,網上有很多是按照狀態來分,分為一維、二維、區間、樹形等等。我覺得還是按功能即解決的問題的型別以及難易程度來分比較好,下面按照我自己的理解和歸納,把動態規劃的分類如下:

一、簡單基礎dp

這類dp主要是一些狀態比較容易表示,轉移方程比較好想,問題比較基本常見的。主要包括遞推揹包LIS(最長遞增序列)LCS(最長公共子序列),下面針對這幾種型別,推薦一下比較好的學習資料和題目。

1、遞推:

遞推一般形式比較單一,從前往後,分類列舉就行。

簡單:

推薦:

2、揹包

主要有0-1揹包完全揹包分組揹包多重揹包

簡單:

推薦:

3、LIS

最長遞增子序列,樸素的是o(n^2)演算法,二分下可以寫成o(nlgn):維護一個當前最優的遞增序列——找到恰好大於它更新

簡單:

推薦:

4、LCS

最長公共子序列,通常o(n^2)的演算法

二、區間dp

區間dp,一般是列舉區間,把區間分成左右兩部分,然後求出左右區間再合併。

三、樹形dp

樹形dp是建立在樹這種資料結構上的dp,一般狀態比較好想,通過dfs維護從根到葉子或從葉子到根的狀態轉移。

四、數位dp

數位dp,主要用來解決統計滿足某類特殊關係或有某些特點的區間內的數的個數,它是按位來進行計數統計的,可以儲存子狀態,速度較快。數位dp做多了後,套路基本上都差不多,關鍵把要儲存的狀態給抽象出來,儲存下來。

五、概率(期望) dp

推薦論文:

一般來說概率正著推,期望逆著推。有環的一般要用到高斯消元解方程。期望可以分解成多個子期望的加權和,權為子期望發生的概率,即 E(aA+bB+...) = aE(A) + bE(B) +...

六、狀態壓縮dp

這類問題有TSP插頭dp等。

七、資料結構優化的dp

有時儘管狀態找好了,轉移方程的想好了,但時間複雜度比較大,需要用資料結構進行優化。常見的優化有二進位制優化、單調佇列優化、斜率優化、四邊形不等式優化等。

1、二進位制優化

主要是優化揹包問題,揹包九講裡面有介紹,比較簡單,這裡只附上幾道題目。

2、單調佇列優化

3、斜率優化

4、四邊形不等式優化

相關推薦

動態規劃總結題目推薦

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

動態規劃的一些題目解法

1、假設有幾種硬幣,如1、3、5,並且數量無限。請找出能夠組成某個數目的找零所使用最少的硬幣數。  解法: #include<stdio.h> int sum=0; void Min(int n) { if(n<1) Sum+=0; else if(n==

動態規劃初探什麽是無後效性? (轉)

電腦 整理 tar aux 小白 zax ima 個數 研究 轉自:http://blog.csdn.net/qq_30137611/article/details/77655707 初探動態規化 剛學動態規劃,或多或少都有一些困惑。今天我們來看看什麽是動態規劃,以及他的

HDU 動態規劃 46道題目的學習

                              HDU 動態規劃(46道題目) 原作者網址:http://www.cppblog.co

3143: 動態規劃進階題目之滑雪

3143: 動態規劃進階題目之滑雪 時間限制: 1 Sec  記憶體限制: 64 MB提交: 62  解決: 29[提交][狀態][討論版][命題人:lyh] 題目描述 Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度

leetcode與資料結構---動態規劃總結(一)

這幾天一直在做leetcode上關於動態規劃方面的題目,雖然大二下的演算法設計課上較為詳細的講過動態規劃,奈何遇到新穎的題目或者稍加背景的題目立刻就原形畢露不知題目所云了。動態規劃算是較難的一個專題了,但只要找到遞推關係其最終的程式碼又相當簡便。現在把這幾天做過的題目整理總結一下,畢竟只求做

LeetCode-動態規劃總結(二)

最長遞增子序列 已知一個序列 {S1, S2,…,Sn},取出若干陣列成新的序列 {Si1, Si2,…, Sim},其中 i1、i2 … im 保持遞增,即新序列中各個數仍然保持原數列中的先後順序,稱新序列為原序列的一個 子序列 。 如果在子序列中,當下標 ix > iy

LeetCode-動態規劃總結(一)

動態規劃 遞迴和動態規劃都是將原問題拆成多個子問題然後求解,他們之間最本質的區別是,動態規劃儲存了子問題的解,避免重複計算。 斐波那契數列 爬樓梯 70. Climbing Stairs (Easy) 題目描述:有 N 階樓梯,每次可以上一階或者兩階,求有多少種上樓梯

動態規劃總結

一.揹包問題: 揹包的初始化相關問題: 1.最大價值且恰好裝滿:dp[0]=0 其他負無窮 2.最小价值且恰好裝滿:dp[0]=0 其他正無窮 3.不恰好裝滿:都為0 揹包模板: #include<cstdio> int main() { //W 總

動態規劃dp經典題目:最大連續子序列和

最大連續子序列和問題         給定k個整數的序列{N1,N2,...,Nk },其任意連續子序列可表示為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k。最大連續子序列是所有連續子序中元素和最大的一個,例如給

ACM動態規劃總結(by utobe67)

       動態規劃一直是ACM競賽中的重點,也是難點(對於我這種水平),因為該演算法時間效率高,程式碼量少,多元性強、靈活度高,主要考察思維能力、建模抽象能力。學了這麼久動態規劃,雖然還只是個菜菜= =,但還是想總結一下,總得給學弟學妹留下一些什麼吧。        

動態規劃演算法(後附常見動態規劃例題Java程式碼實現)

原文連結 一、基本概念     動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。 二、基本思想與策略     基本思想與分治法類似,也是

HDU 動態規劃(46道題目)

Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 揹包;第一次做的時候把概率當做揹包(放大100000倍化為整數):在此範圍內最多能搶多少錢 最腦殘的是把總的概率以為是搶N家銀行的概率之和… 把狀態轉移方程寫

演算法之動態規劃總結

五、動態規劃題集整理 一、動態規劃初探       1、遞推       暫且先不說動態規劃是怎麼樣一個演算法,由最簡單的遞推問題說起應該是最恰當不過得了。因為一來,遞推的思想非常淺顯,從初中開始就已經有涉及,等差數列 f[i] = f[i-1] + d( i > 0, d為公

ytu oj 動態規劃進階題目之開餐館

dp[i][0]代表第i個餐館沒有被選中,dp[i][1]代表第i個餐館被選中 所以狀態轉移方程看程式碼-_- #include<stdio.h> #include<iostream

(轉載)【DP專輯】ACM動態規劃總結

動態規劃(英語:Dynamic programming,DP)是一種在數學、電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。 動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解

poj 動態規劃題目列表總結

 1015 Jury Compromise 1029 False coin 1036Gangsters 1037 A decorative fence 1038 Bugs Integrated, Inc. 1042 Gone Fishing1050 To the Max 1062 昂貴的聘禮 1074 Pa

動態規劃算法的理解相關題目分析

自底向上 esp 它的 解包 宋體 成了 -h temp ace 1、對動態規劃算法的理解 (1)基本思想: 動態規劃算法的基本思想與分治法類似:將待求解的問題分解成若幹個子問題,先求解子問題,然後從這些子問題的解中得到原問題的解。但是,與分治法不同的是,為了避免重復多次計

動態規劃】常見動態規劃題目總結

此部落格是為總結動態規劃常見題目。 嗯,當然也包含了大量非動態規劃問題。 題目型別真亂。 題目1:word break 1.1 題目描述: Given a string s and a dictionary of words dict, determine if

動態規劃經典題目總結

在演算法中,動態規劃題目算是比較經典的一類題目。在找工作中,不管是筆試,還是面試,我們經常會遇到用動態規劃來解決問題的情況,有時候面試官還需要我們現場手寫出動態規劃解法的程式碼。因此,在求職中能靈活的運用動態規劃就相當重要了。下面我總結出了一些經典的動態規劃題目,其中有些還是面試中遇到的。