第 2 章:初出茅庐【初级篇 - 2.3 动态规划】
生活随笔
收集整理的這篇文章主要介紹了
第 2 章:初出茅庐【初级篇 - 2.3 动态规划】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 218. 01背包問題【經典模型】
- 220. 最長公共子序列問題【經典模型】
- 219. 完全背包問題【經典模型】
- 221. 01背包問題之 2【經典模型】
- 222. 多重部分和問題【中 有意思】
- 223. 最長上升子序列問題【經典模型】
218. 01背包問題【經典模型】
https://www.papamelon.com/problem/218
狀態表示: f[i][j] 表示從前i個物品中選 總體積不超過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; }優化空間至一維。
#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. 最長公共子序列問題【經典模型】
https://www.papamelon.com/problem/220
狀態表示: f[i][j] 表示a的前i個字符 和 b的前j個字符的最長公共子序列個數
- a的第i個不選,b的第j個也不選f[i-1][j-1]
- a的第i個選,b的第j個不選f[i][j-1]
- a的第i個不選,b的第j個選f[i-1][j]
- a的第i個選,b的第j個也選。這時候就要判斷a[i]是否等于b[j] 如果相等則f[i-1][j-1]+1
其實都不選的狀態可以不用寫,因為其他的幾種狀態就已經包含了。
#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. 完全背包問題【經典模型】
https://www.papamelon.com/problem/219
221. 01背包問題之 2【經典模型】
https://www.papamelon.com/problem/221
通過分析,你會發現我們的體積是太大了,但是有一個就是我們的價值和很小的。
故f[i][j] 表示再前i中選總價值為j 的最小體積 其本質基于貪心的思維,對于同樣價值的物品我們肯定是希望浪費的體積越小越好。
最后我們在按總價值從大到小枚舉,第一個體積小于我們背包總體積的就是答案。
222. 多重部分和問題【中 有意思】
https://www.papamelon.com/problem/222
f[i][j] 表示前i個數,總和為j。第i類剩余的個數
223. 最長上升子序列問題【經典模型】
https://www.papamelon.com/problem/223
f[i] 表示以i結尾的最長上升子序列
總結
以上是生活随笔為你收集整理的第 2 章:初出茅庐【初级篇 - 2.3 动态规划】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第 2 章:初出茅庐【初级篇 - 2.2
- 下一篇: 牛客竞赛语法入门班数组字符串习题【完结】