動態規劃問題

2021-08-18 08:08:52 字數 1466 閱讀 8050

以下內容基於個人理解。

一、什麼是動態規劃

動態規劃(dp)演算法,指的是:乙個問題的解決是依賴於若干個和該問題相似,但比該問題的問題規模更小的問題時,所採用的一種演算法。動態規劃是自底向上的思考問題的方法,通常要從最底層的問題開始考慮。而這類問題的特點是:解決所有本層次問題後,就可以解決上一層的問題,由此達到求解問題的目的。

二、動態規劃和遞迴

動態規劃的思想類似於遞迴的思想,乙個不同點是,遞迴是自頂向下的,dp是自底向上的。另乙個更重要的不同點是,動態規劃會通過額外的記憶體「去重複」,我們在使用遞迴時,往往會由於解決本層次問題時,下一層次問題還沒有解決,而導致大量的運算。例如:我們需要通過n次遞迴運算來求得f(n),而f(n)的計算依賴於f(n-1)和f(n-2),當我們利用遞迴調到問題的下一層次,即f(n-1)和f(n-2)時,我們會發現,f(n-1)同樣依賴了f(n-2),這就會導致大量重複運算。而dp的思路則是,由於上下層次的關聯性,在每次計算完成後,都把運算結果存下來,這樣就節省了大量的空間。

三、動態規劃的步驟

1、將問題自頂向下的分析,找出解決該問題所需的子問題。

2、找到問題的最低層次,將最低層次的問題的解表示出來。

3、找到如何由該子問題向上推導出上一層次的問題。

4、從底層的上一層開始,依次向上遍歷,在每次遍歷的過程中,求出該層次的解,直至頂層。

四、網上的一些例子

public static void main(string args)

else if(n==2)

else if(n==3)

else{

max[0] = 0;

max[1] = 1;

max[2] = 2;

max[3] = 3;

int temp = 0;

for(int l = 4;l給定乙個數列,長度為n,

求這個數列的最長上公升(遞增)子數列(lis)的長度.

以1 7 2 8 3 4

為例。這個數列的最長遞增子數列是 1 2 3 4,長度為4;

public static void main(string args) {

//輸入

scanner in = new scanner(system.in);

int n = in.nextint();

int num = new int[n];

for(int i = 0;inum[j]){

if(max五、深思

動態規劃問題的本質實際在於「記憶化」,即我們在演算法中通過額外的記憶體空間「記憶」一些在接下來計算中可能還要用的資料,使得下次再使用時,不必再費力做重複性工作。由於動態規劃問題中,底層狀態會對上層狀態造成影響,所以不同於貪心的「保證每次最優即整體最優」,dp問題在選擇了底層的某一狀態後,上一層的最優可能會被限制而取不到,導致錯過了整體最優。

於是對於dp問題,通常是具有這種特徵的:

動態規劃問題

思想 如果乙個問題是由交疊的子問題所構成,那麼我們就可以用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞迴關係中。這個遞推關係包含了相 同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中。例題 0 1揹包問...

動態規劃問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量v,n v同時為0時結束測試,...

動態規劃問題

連續自陣列的最大和問題,要求時間複雜度o n bool g invalidinput false int greatestsumofsubarray int array,int length int currentsum 0 int greatestsum 0x80000000 for int i ...