第 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 i=1;i<=n;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[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-1][j-1],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;
}
其实都不选的状态可以不用写,因为其他的几种状态就已经包含了。
#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
#include<bits/stdc++.h>
using namespace std;
const int N=10100;
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 i=1;i<=n;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][j-v[i]]+w[i]);}}cout<<f[n][m];return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=10100;
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 i=1;i<=n;i++){for(int j=v[i];j<=m;j++){f[j]=max(f[j],f[j-v[i]]+w[i]);}}cout<<f[m];return 0;
}
221. 01背包问题之 2【经典模型】
https://www.papamelon.com/problem/221
通过分析,你会发现我们的体积是太大了,但是有一个就是我们的价值和很小的。
故f[i][j] 表示再前i中选总价值为j 的最小体积
其本质基于贪心的思维,对于同样价值的物品我们肯定是希望浪费的体积越小越好。
最后我们在按总价值从大到小枚举,第一个体积小于我们背包总体积的就是答案。
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
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];memset(f,0x3f,sizeof f);for(int i=0;i<=n;i++) f[i][0]=0;for(int i=1;i<=n;i++){for(int j=0;j<N;j++){f[i][j]=f[i-1][j];if(j>=w[i]) f[i][j]=min(f[i][j],f[i-1][j-w[i]]+v[i]);}}for(int i=N-1;i>=0;i--){if(f[n][i]<=m){cout<<i;break;}}return 0;
}
222. 多重部分和问题【中 有意思】
https://www.papamelon.com/problem/222
f[i][j] 表示前i个数,总和为j。第i类剩余的个数
#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int M=1e5+10;
int f[N][M],a[N],cnt[N],n,m;
//f[i][j] 表示前i个数,总和为j。第i类剩余的个数
int main(void)
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>cnt[i];memset(f,-1,sizeof f);for(int i=1;i<=n;i++) f[i][0]=cnt[i];for(int i=1;i<=n;i++) {for(int j=0;j<=m;j++){if(f[i-1][j]>=0) f[i][j]=cnt[i];//不拿if(j>=a[i]&&f[i][j-a[i]]>0) f[i][j]=max(f[i][j],f[i][j-a[i]]-1);//拿}}if(f[n][m]>=0) puts("Yes");else puts("No");return 0;
}
223. 最长上升子序列问题【经典模型】
https://www.papamelon.com/problem/223
f[i] 表示以i结尾的最长上升子序列
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int f[N],n,a[N];
int main(void)
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){f[i]=1;for(int j=1;j<i;j++)if(a[j]<a[i]) f[i]=max(f[i],f[j]+1);}int ans=0;for(int i=1;i<=n;i++) ans=max(ans,f[i]);cout<<ans;return 0;
}
第 2 章:初出茅庐【初级篇 - 2.3 动态规划】相关推荐
- Kotlin——初级篇(六):空类型、空安全、非空断言、类型转换等特性总结
在我们熟知的Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null. ...
- android 怎么调用js项目_APP逆向神器之Frida【Android初级篇】
说到逆向APP,很多人首先想到的都是反编译,但是单看反编译出来的代码很难得知某个函数在被调用时所传入的参数和它返回的值,极大地增加了逆向时的复杂度,有没有什么办法可以方便地知道被传入的参数和返回值呢? ...
- 视频教程-微信小程序开发【初级篇 / 附案例】-微信开发
微信小程序开发[初级篇 / 附案例] 北风网讲师!瓢城Web俱乐部创始人,教学总监! 李炎恢 ¥129.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程, ...
- html5 canvas实训报告,初级篇关于HTML5 canvas调研报告样本.doc
初级篇关于HTML5 canvas调研报告样本 初级篇关于HTML5 canvas调研报告样本 初级篇关于HTML5 canvas调研报告样本 第一章 绘制步骤 一.取得canvas元素 所有的绘图功 ...
- Java工程师学习指南(初级篇)
Java工程师学习指南 初级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...
- WarGame系列之Natas(Web安全)通关指北(初级篇0-10)详细版
*OverTheWire社区是一个提供wargame的网站,可以帮助安全爱好者以趣味的方式进行学习.练习安全知识. 本系列文章旨在记录笔者通关思路,其中解题思路也会参考借鉴网上已有文章,在此感谢相关作 ...
- osg中运用Shader(osg初级篇2)
关于shader的概念,可以参见我的另一篇博客<opengl版本发展史及各种概念的厘清>,这里列举一个例子,用来实现一个特效,屏幕的左半部显示为红色.首先我们准备好两个shader程序: ...
- 开关电源反馈环路设计matlab,开关电源控制环路设计(初级篇).pdf
开关电源控制环路设计(初级篇) 开关电源控制环路设计(初级篇) Prepared by: Chen Xiaomin Mobile: Email: cxmmeg@ Date: December 30, ...
- Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务
本节,直接写通过代码来学习.这些基本操作都比较简单,与这些基本操作相关的内容在之前的1至6节基本介绍完毕.l 增加: 方法1:使用AddToXXX(xxx)方法:实例代码如下:using (var e ...
最新文章
- Shell中的for循环
- DataStage8.7连接远程Oracle数据库
- hdu-4045 Machine scheduling
- 搭建基础架构-Page
- ES6的字符串与正则表达式
- 机器学习-算法背后的理论与优化(part6)--正则化的优缺点
- 工作119:axios请求封装
- 【原创】注意析构函数的使用
- duration java_Java Duration类| ofHours()方法与示例
- 南京林业大学计算机科学技术,南京林业大学信息科学技术学院
- Confluence 6 SQL 异常的问题解决
- dg修改归档目录 oracle_Oracle RAC归档管理: 修改归档位置(FRA和其他位置)
- Windows操作系统架构梳理
- qq空间音乐外链,音乐永久地址,连接dj,连接音乐,背景音乐,舞曲背景0sm.com
- FZU 2122 又见LKity
- php服务器怎么设置cookie,PHP之COOKIE支持详解
- Python办公自动化入门-Excel合并同类项内容
- 语法转换_语法 | 句型转换之陈述句变一般疑问句
- java分别用链表和数组实现栈
- 细胞器基因组|比较基因组分析助力深度挖掘细胞器进化关系
热门文章
- TF之CNN:利用sklearn(自带手写数字图片识别数据集)使用dropout解决学习中overfitting的问题+Tensorboard显示变化曲线
- 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
- linux 上传带宽限速
- 语法:MySQL中INSERT INTO SELECT的使用
- BLE-NRF51822教程15-BLE地址
- ESP8266 Flash
- Bitcoin 中的挖矿算法(4) 产生genesis区块
- [密码学] 公钥密码基础与RSA
- git/gitee操作手册
- Linux Kernel中spinlock的设计与实现