例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 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...