演算法 動態規劃

2022-08-27 01:15:09 字數 2580 閱讀 6676

動態規劃是將原始問題分解為若干個子問題,對子問題進行求解,並記錄下子問題的結果,當求解包含已經解決的子問題的原問題時,返回子問題的結果即可

轉移方程、邊界

最優子結構

數塔問題

在如上數塔中,選取一條路徑使得路徑上的數字和最大

設數塔表示為\(f[i][j]\),\(dp[i][j]\)表示選擇了\(f[i][j]\)能得到的最大的和,得到轉移方程為:

\[dp[i][j] = \max+f[i][j]

\]邊界為:

\(dp[n][j] = f[n][j]\)

遞迴求解即可

斐波那契數列求解

走樓梯

不定終點

定終點終點固定為t,總體和不定終點一樣,不同在邊界條件:

\(dp[t] = 0, dp[i] = -inf (i \neq t)\)

例項在給定的dag中尋找關鍵路徑

//

#include#include#include#include#include#include#include#include#includeusing namespace std;

struct node;

const int nmax = 20;

vectorg[nmax];

unordered_mapmp;

char rmp[nmax];

int cnt = 0;

void getindex(char ch)

}int dp[nmax], choice[nmax];

int dp(int i)

}return dp[i];

}void printpath(int s)

}void init()

mp.clear();

cnt = 0;

}int main()

for(int j = 0; j < m; ++j));

}int ans = 0, s;

for(int j = 0; j < n; ++j)

}printpath(s);

printf("%d\n", ans);

}return 0;

}

01揹包

設陣列\(dp[i][v],0 \leq i\leq n, w[i] \leq v \leq v\)表示前\(i\)件物品放入容量為\(v\)的揹包中獲得的最大價值,狀態轉移方程為:\(dp[i][v] = \max(dp[i-1][v], dp[i - 1][v-w[i]] + c[i])\),邊界條件為:\(dp[0][v] = 0\)

for(int i = 1; i <= n; ++i)

}

求解出dp陣列後,遍歷\(dp[n][v]\),取最大值即為能得到的最大價值

注:dp陣列的求解

在求解\(dp[i][v]\)時,只與\(dp[i-1][v]\)和\(dp[i][v - w[i]]\)的狀態有關,省去\(i\)的維度,轉移方程寫作:\(dp[v] = \max(dp[v], dp[v - w[i]] + c[i]), w[i]\leq v \leq v\)

求解時倒著列舉v

如果正向列舉,則前乙個狀態的\(dp[v-w[i]]\)會被覆蓋

記錄選擇方式

開乙個陣列\(choice[i][v]\),當\(choice[i][v] == 1\)時表示前\(i\)件物品取得最大值時選擇了第\(i\)件,否則就沒選,最終倒著列舉$choice[i][v], v = \arg\max_(dp[v]) $就能獲得選擇的方案

例子:

(pat1068)第一行給出貨幣個數n和應付金額m,第二行給出n個貨幣的面額,求出付錢的方式,如果方式不唯一,給出字典序最小的方案,如果沒有答案,輸出"no solution"

分析:

(1)要求的答案是$v_1 + v_2 +...+v_k == m \(,因此應付金額m對應揹包容量v,面額對應物品的質量,同時面額也對應物品的價值,因此無解的判定條件時\)dp[m] != m$

(2)要輸出字典序最小的答案,先將陣列逆序(因為滾動陣列中v是逆序列舉),當\(dp[v - w[i]] + c[i] == dp[v]\)時,選擇放第 i 件物品(不放得到的會是字典序最大的)

//求dp陣列

for(int i = 1; i <= n; ++i)

}}//輸出路徑

bool flag = false;

for(int i = n; i >= 1; --i)

}

完全背

演算法 動態規劃

動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...

演算法 動態規劃

1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...

演算法 動態規劃

動態規劃的定義 動態規劃是運籌學的乙個分支,是求解決策過程的最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法 動態規...