1.定義
動態規劃是解決多階段決策問題的一種方法,也是一種排除重複計算的演算法,更具體的說,動態規劃就是用空間換取時間。
2.動態規劃問題具有以下基本特徵:
(1)問題具有多階段決策的特徵。
(2)每一階段都有相應的「狀態」與之對應,描述狀態的量稱為「狀態變數」。
(3)每一階段都面臨乙個決策,選擇不同的決策將會導致下一階段不同的狀態。
(4)每一階段的最優解問題可以遞迴地歸結為下一階段各個可能狀態的最優解問題,各子問題與原問題具有完全相同的結構。
3.動態規劃的幾個概念
階段:據空間順序或時間順序對問題的求解劃分階段。
狀態:描述事物的性質,不同事物有不同的性質,因而用不同的狀態來刻畫。對問題的求解狀態的描述是分階段的。
決策:根據題意要求,對每個階段所做出的某種選擇性操作。
狀態轉移方程:用數學公式描述與階段相關的狀態間的演變規律。
4.指導思想
在做每一步決策時,列出各種可能的區域性解,依據某種判定條件,捨棄那些肯定不能得到最優解的區域性解。以每一步都是最優的來保證全域性是最優的
5.動態規劃問題的一般解題步驟
(1)判斷問題是否具有最優子結構性質,若不具備則不能用動態規劃。
(2)把問題分成若干個子問題(分階段)。
(3)建立狀態轉移方程(遞推公式)。
(4)找出邊界條件。
(5)將已知邊界值帶入方程。
(6)遞推求解。
注:動態規劃的多階段決策問題
如果一類問題的求解過程可以分為若干個互相聯絡的階段,在每乙個階段都需作出決策,並影響到下乙個階段的決策。多階段決策問題,就是要在可以選擇的那些策略中間,選取乙個最優策略,使在預定的標準下達到最好的效果.其依靠的是最優性原理:不論初始狀態和第一步決策是什麼,餘下的決策相對於前一次決策所產生的新狀態,構成乙個最優決策序列。最優決策序列的子串行,一定是區域性最優決策子串行。包含有非區域性最優的決策子串行,一定不是最優決策序列。
例題:(最長上公升子串行問題)乙個數的序列bi,當b1 < b2 < ... < bs 的時候,我們稱這個序列是上公升的。對於給定的乙個序列(a1, a2, ..., an),我們可以得到一些上公升的子串行(ai1, ai2, ..., aik),這裡1 <= i1 < i2 < ...
輸入資料
輸入的第一行是序列的長度n (1 <= n <= 1000)。第二行給出序列中的n 個整數,這些整數的取值範圍都在0 到10000。
輸出要求
最長上公升子串行的長度。
輸入樣例
71 7 3 5 9 4 8
輸出樣例
4**:
#include
#include
#include
#include
int b[max_n + 10];
int amaxlen[max_n + 10];
int main()
}amaxlen[i] = ntmp + 1;}
int nmax = -1;
for( i = 1;i <= n;i ++ )
if( nmax < amaxlen[i])
nmax = amaxlen[i];
printf("%d\n", nmax);
return 0;}
經典問題(空間換時間)
樓梯問題 描述
:(1)(nuaa 1350)某學校跳樓塔從底到頂只有乙個樓梯,共 n 階,一同學在第 k 次收到 cet-4 <= 250 的證書後欲爬上該塔自行了斷,已知該同學每次可以上 1 階或 2 階,則他從塔底走到塔頂共有多少種方法?(2)當他爬到塔頂早已累得沒有跳下去的勇氣了,只想早點回到宿舍去上校內,此時他回城心切,可以每次下 1 階、 2 階或 3 階,則他從塔頂走到塔底共有多少種方法?
輸入:只有乙個整數 n (1 <= n <= 30)
輸出:只有 1 行,包含 2 個整數,中間用空格分開,分別為走上和走下 n 階樓梯所對應的方法總數
樣例輸入
:3樣例輸出
:3 4
問題分析
(1)上樓梯時
狀態設計:f(i) 表示上 i 階樓梯所對應的方法總數
求解目標:f(n)
狀態轉移方程:
f(i) = f(i-1) + f(i-2) 2 <= i <= n
f(i) = 1 0 <= i <= 1
(2)下樓梯時
狀態設計:g(i) 表示下 i 階樓梯所對應的方法總數
求解目標:g(n)
狀態轉移方程:
g(i) = g(i-1) + g(i-2) + g(i-3) 3 <= i <= n
g(i) = 2 i = 2
g(i) = 1 i = 1 或 i = 0
**實現
初始化:
int n, i, f[31], g[31];
scanf("%d", &n);
(1)上樓梯時
f[1] = f[0] = 1;
for (i = 2; i <= n; ++i)
f[i] = f[i - 1] + f[i - 2];
(2)下樓梯時
g[1] = g[0] = 1;
g[2] = 2;
for (i = 3; i <= n; ++i)
g[i] = g[i - 1] + g[i - 2] + g[i - 3];
ACM第三專題 動態規劃總結
一.概述 動態規劃的基本思想 若要解乙個給定問題,我們需要解其不同部分 即子問題 再合併子問題的解以得出原問題的解。通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量 一旦某個給定子問題的解已經算出,則將其 記憶化儲存,以便下次需要同乙個子問題解之時直接查表。這種做法在...
專題三 動態規劃總結
在這篇部落格裡我寫一下做了乙個月的dp之後對dp的粗淺認識,並附上一些學習資源。如果乙個問題的最優解包含其子問題的最優解,我們就稱此問題具有最優子結構。摘自 演算法導論 也就是說,具有最優子結構的問題的最優解一定是由其各個子問題的最優解組合而成的。我覺得dp最關鍵的就是找出狀態轉移方程,即找出問題的...
專題三 總結動態規劃
動態規劃總結 一 解釋 解決多階段策略問題的一種方法,運用最優性原理,排除重複計算,用空間換時間的演算法。二 適用的題目型別 1.問題具有多階段的決策 2.每個階段對應乙個狀態 狀態變數 3.每個階段有乙個決策 不同的決策導致下乙個階段不同的狀態 4.每個階段的最優解可以遞迴地歸結為下乙個階段各個可...