動態規劃入門part2

2021-08-16 01:51:31 字數 2240 閱讀 5726

例2 :

在這樣乙個arr陣列中12

3456

7 找出互不相臨的n個數,使這些數的和最大。

依舊是乙個求最優解的動態規劃問題,求解的關鍵是找出每乙個狀態選和不選的指標函式。

選:

opt(i) = opt(i-2) + arr[i];
不選:

opt(i) = opt(i-1);
遞迴出口:

opt(1) = arr[1];

opt(2) = max(arr[1],arr[2]);

這時已經可以寫出遞迴求解方法:

#include

#include

using namespace std;

int arr[10]

=;intrec_opt

(int n)

//rec_opt即上文中opt,rec代表遞迴recursion

intmain()

畫出樹形圖:

如opt(3)和opt(4),遞迴求解過程存在重疊子結構。

在動態規劃演算法中使用opt陣列記錄每乙個狀態

#include

#include

using namespace std;

int arr[10]

=;int opt[10]

;int

dp_opt

(int n)

//rec代表是遞迴recursion

return opt[n];}

intmain()

例題3 :
在這樣乙個arr陣列中334

41252

輸入乙個整數s,如果存在陣列中的n數之和等於s則輸出true,否則輸出false。

本題依舊是求最優解的問題,求解的關鍵是找出每乙個狀態選和不選的指標函式。

定義subset(i,s)函式 ,第乙個引數表示陣列中當前位置i之前的所有數可選,s表示還需要的和 (subset是子集的意思)。

當s輸入為9時

如果選arr[5] (arr[5] = 2)

subset(arr[5],9) = arr[5]+subset(arr[4],7);
如果不選arr[5]

subset(arr[5],9) = subset(arr[4],9));
遞迴出口:

1.s已經等於0時

if(s == 0)

return true;

2.當i = 0,s不等於0時

if(i == 0 && arr[i] == s)

return true;

else

return false;

3.當arr[i]>s時,不考慮選的情況

if(arr[i]>s)

return(subset(arr[i-1],s));

遞迴演算法:

#include

#include

using namespace std;

int arr[10]

=;bool rec_opt

(int n,

int s)

}int

main()

動態規劃:

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...