第 2 章:初出茅庐【初级篇 - 2.3 动态规划】
目錄
- 218. 01背包問(wèn)題【經(jīng)典模型】
- 220. 最長(zhǎng)公共子序列問(wèn)題【經(jīng)典模型】
- 219. 完全背包問(wèn)題【經(jīng)典模型】
- 221. 01背包問(wèn)題之 2【經(jīng)典模型】
- 222. 多重部分和問(wèn)題【中 有意思】
- 223. 最長(zhǎng)上升子序列問(wèn)題【經(jīng)典模型】
218. 01背包問(wèn)題【經(jīng)典模型】
https://www.papamelon.com/problem/218
狀態(tài)表示: f[i][j] 表示從前i個(gè)物品中選 總體積不超過(guò)j的最大價(jià)值
其實(shí)可以邊讀入邊計(jì)算。
#include<bits/stdc++.h> using namespace std; const int N=1010; int f[110][N],n,m,w[N],v[N]; int main(void) {cin>>n>>m;for(int i=1;i<=n;i++){cin>>v[i]>>w[i];for(int j=0;j<=m;j++){f[i][j]=f[i-1][j];if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);}}cout<<f[n][m];return 0; }優(yōu)化空間至一維。
#include<bits/stdc++.h> using namespace std; const int N=1010; int f[N],n,m,w[N],v[N]; int main(void) {cin>>n>>m;for(int i=1;i<=n;i++){cin>>v[i]>>w[i];for(int j=m;j>=v[i];j--){f[j]=max(f[j],f[j-v[i]]+w[i]);}}cout<<f[m];return 0; }220. 最長(zhǎng)公共子序列問(wèn)題【經(jīng)典模型】
https://www.papamelon.com/problem/220
狀態(tài)表示: f[i][j] 表示a的前i個(gè)字符 和 b的前j個(gè)字符的最長(zhǎng)公共子序列個(gè)數(shù)
- a的第i個(gè)不選,b的第j個(gè)也不選f[i-1][j-1]
- a的第i個(gè)選,b的第j個(gè)不選f[i][j-1]
- a的第i個(gè)不選,b的第j個(gè)選f[i-1][j]
- a的第i個(gè)選,b的第j個(gè)也選。這時(shí)候就要判斷a[i]是否等于b[j] 如果相等則f[i-1][j-1]+1
其實(shí)都不選的狀態(tài)可以不用寫(xiě),因?yàn)槠渌膸追N狀態(tài)就已經(jīng)包含了。
#include<bits/stdc++.h> using namespace std; const int N=1e3+10; int f[N][N],n,m; char a[N],b[N]; int main(void) {cin>>n>>m>>a+1>>b+1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){f[i][j]=max(f[i][j-1],f[i-1][j]);if(a[i]==b[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);}}cout<<f[n][m]<<endl;return 0; }219. 完全背包問(wèn)題【經(jīng)典模型】
https://www.papamelon.com/problem/219
221. 01背包問(wèn)題之 2【經(jīng)典模型】
https://www.papamelon.com/problem/221
通過(guò)分析,你會(huì)發(fā)現(xiàn)我們的體積是太大了,但是有一個(gè)就是我們的價(jià)值和很小的。
故f[i][j] 表示再前i中選總價(jià)值為j 的最小體積 其本質(zhì)基于貪心的思維,對(duì)于同樣價(jià)值的物品我們肯定是希望浪費(fèi)的體積越小越好。
最后我們?cè)诎纯們r(jià)值從大到小枚舉,第一個(gè)體積小于我們背包總體積的就是答案。
222. 多重部分和問(wèn)題【中 有意思】
https://www.papamelon.com/problem/222
f[i][j] 表示前i個(gè)數(shù),總和為j。第i類(lèi)剩余的個(gè)數(shù)
223. 最長(zhǎng)上升子序列問(wèn)題【經(jīng)典模型】
https://www.papamelon.com/problem/223
f[i] 表示以i結(jié)尾的最長(zhǎng)上升子序列
總結(jié)
以上是生活随笔為你收集整理的第 2 章:初出茅庐【初级篇 - 2.3 动态规划】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第 2 章:初出茅庐【初级篇 - 2.2
- 下一篇: 牛客竞赛语法入门班数组字符串习题【完结】