什麼是動態規劃?
動態規劃是分階段劃分求最優值的的演算法。
1將複雜問題按階段劃分成子問題;
2列舉問題各種可能情況,從中找出最優值;
3利用子問題的最優解球的原問題的最優解。
列1小明寫了乙個簡單的吃金幣遊戲,規則如下:
在乙個長方形地圖上,玩家每次能從乙個方格走到相鄰乙個方格。
玩家控制的角色可以向下或者向右走,但不能向上或向左走。每個方格上都有
一定的金幣。
現在,小明想請你幫他想乙個策略,盡可能多的獲得金幣(從左上角走到右下角可能獲得的最大金幣數)。
如果用f[a][b]表示達到(a,b)這個點時所能吃到的最大金幣數量。
得到 遞推關係式:
f[a][b]=max(f[a-1][b],f[a][b-1])+coin[a][b]//狀態轉移方程
(此步即為遞迴定義最優解的值,列出狀態轉移方程)
f[m][n]即為所求。
那麼為什麼是這樣那?
思路如下;
我們每次只能向下或向右走一步,並且最後我們一定在右下角。那麼我們把這個方格看作乙個二位陣列。那麼最後的乙個空格的來路只有兩種情況。即當前位置f[a][b]=max(f[a-1][b],f[a][b-1])+coin[a][b](從上或從左中的最大值加上當前位置的金幣。
**如下:
```cpp
#includeusing namespace std;
int f[max][max];
int main()
cout動態規劃問題具有以下基本特徵:
1問題具有多階段決策的特徵。
2每一階段都有相對應的狀態與之的對應,描述狀態的量稱為狀態變數。
3每一階段都面臨體格決策,選著不同的決策將會導致下一階段不同的
狀臺。4每一階段的最優解問題可以遞迴地歸結為下一階段各個狀態的最優解問題,個子問題與原問題具有完全相同的結構。
動態規劃一般步驟
1判斷問題是否具有最優子結構,若不具有則不用動態規劃。
2分解成若干個子問題。
3遞推公式。
4找出邊界條件。
5已知邊界值帶入方程。
列2最長上公升子串行。
給出乙個數列,要求你選出盡量多的元素,使這些元素按其相對位置單調遞增。
任務就是對於給定的序列,求出最長上公升子串行的長度。
輸入資料:輸入的第一行是序列的長度n(1<=n<=1000)。第二行給出序列中的n個整數,這些整數的取值範圍都是0~10000。
輸出要求:最長上公升子串行的長度。
輸入樣例:
1 7 3 5 9 4 8
輸出樣例:
4方法:分解子問題,求以ak(k=1,2,3』』』』』)為最長上公升子串行的長度為子問題。
即
#include
#include
using namespace std;
#define max_n 1000
int b[max_n+10];
int maxlen[max_n+10];
int main()
列3最長公共子串行
在序列x=與y=中查詢長度最長的公共子串行,往往不是乙個。例如:x=,y=,則公共子串行有z=,z1=,z2=
分析:用c[i][j]記錄序列xi和yi的最長公共子串行的長度。當i=0或者j=0時,xi和yi的最長公共子串行為空,所以c[i][j]=0。
其他情況:當xi=yi時,c[i][j]=c[i-1][j-1]+1。當xi不等於yi時,c[i][j]=max
動態規劃入門
1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...
動態規劃入門
大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....
動態規劃入門
學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...