拦截导弹简单版——线性dp
题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
样例
样例输入
389 207 155 300 299 170 158 65
样例输出
6
2
分析:本题共两问:第一问可以等价为求最大不上升子序列。这样问题就简单了。
首先定义一个i和j。j想对于i更新较快,j<=i。

定义f[i]表示从1到i的最大非上升子序列长度,a[i]为i的高度。如果a[j]>a[i]那么f[i]就可能需要更新所以f[i]=max(f[i],f[j]+1);

1 for(int i=1;i<=n;i++){
2 f[i]=1; //一定不要忘记第一个也算一个
3 for(int j=1;j<i;j++){
4 if(h[i]<=h[j]) f[i]=max(f[i],f[j]+1);
5 }
6 maxx=max(maxx,f[i]);
7 }
核心代码
第二问我一开始想的是用多次求最长不上升子序列,但这个想法显然是错的比如“7 5 4 1 6 3 2”用多次求最长不上升序列所有为”7 5 4 3 2”,
”1”,”6”共3套系统;但其实只要2套,分别为:”7 5 4 1”与”6 3 2”。
正确做法(还有一种做法,效率(n2),超时了,就不说了)第二问的,我们需要用到Dilworth定理:最少链划分=最长反链长度

for(int i=1;i<=n;i++){
g[i]=1;
for(int j=1;j<i;j++){
if(h[i]>h[j]) //求最长上升子序列的长度
g[i]=max(g[i],g[j]+1);
}
mixn=max(mixn,g[i]);
}
核心代码

#include<bits/stdc++.h>
using namespace std;
const int L=200+100;
int n=1,h[L],a[L],f[L],g[L],maxx=-11111111,mixn=-11111111;
int main(){
while (scanf("%d",&h[n])!=EOF)
n++;
n--;
for(int i=1;i<=n;i++){
f[i]=1; //记录第i个前面的最长不上升子序列的长度
for(int j=1;j<i;j++){
if(h[i]<=h[j]) f[i]=max(f[i],f[j]+1);
}
maxx=max(maxx,f[i]);
}
for(int i=1;i<=n;i++){
g[i]=1;
for(int j=1;j<i;j++){
if(h[i]>h[j]) //求最长上升子序列的长度
g[i]=max(g[i],g[j]+1);
}
mixn=max(mixn,g[i]);
}
printf("%d\n%d\n",maxx,mixn);
return 0;
}
完整代码
拦截导弹简单版——线性dp的更多相关文章
- 拦截导弹简单版(读入一串整数时getline(cin,s) stringstream is(s);)
拦截导弹简单版 时间限制: 1 Sec 内存限制: 128 MB提交: 40 解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系 ...
- nyoj 236拦截导弹 简单动归(java)
C/C++: #include<stdio.h> int main() { // freopen("250.txt","r",stdin); ],b ...
- 2018.08.16 洛谷P2029 跳舞(线性dp)
传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- 线性DP之机器分配
题目大意 自己瞅 (懒得打了) 思路 前面是很简单的线性dp,后面是模拟递归输出方案, 模拟递归可以设ny为机器数机器数,nx表示第nx个公司,tot为总盈利,那么则有\(a[nx][i]+dp[nx ...
- 百练_2945 拦截导弹(DP)
描述 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭 ...
- 题目:[NOIP1999]拦截导弹(最长非递增子序列DP) O(n^2)和O(n*log(n))的两种做法
题目:[NOIP1999]拦截导弹 问题编号:217 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 ...
- dp练习(10)——拦截导弹
1044 拦截导弹 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descripti ...
- BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治
2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...
随机推荐
- (数据科学学习手札95)elyra——jupyter lab平台最强插件集
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 jupyter lab是我最喜欢的编辑器,在过往 ...
- python 第二节课内容和练习
一.列表 []表示列表,用','进行分隔,list有序 能够进行索引 切片 (in append extend count index insert pop remove,reverse sort c ...
- javascript操作多选下拉列表
闲来无事,把javascript操作多选下拉列表有关的操作知识复习了一遍,代码附上 <%-- Created by IntelliJ IDEA. User: Administrator Date ...
- Jmeter引用外部jar包的几种方法
总结记录下jmeter引用外部jar包的3种方法及其优缺点: 一.测试计划中添加目录或jar包到Classpath 操作:测试计划->添加目录或jar包到Classpath-->浏览导入j ...
- vue +signalR
概述:ASP.NET Core SignalR是一种开放源代码库,可简化将实时 web 功能添加到应用程序的功能. 实时 web 功能使服务器端代码可以立即将内容推送到客户端. 这玩意的概念我就不多讲 ...
- pwnable.kr-shellshock-witeup
思路是:发现文件执行没什么好反馈显示结果的,于是看文件和权限,通过bash文件猜测可能存在破壳漏洞(CVE-2014-6271)漏洞,于是利用它并结合文件权限成功获得flag. 通过scp下载文件至本 ...
- 使用VMware虚拟机安装RHEL7(RedHat Enterprise Linux7)步骤
准备工具: 1.VMware Workstation 14 2.RedHat Enterprise Linux 7.0镜像文件 在虚拟机内设置操作系统的硬件标准 单击"创建新的虚拟机&quo ...
- idea查询类的继承关系图
方式一:在一个类中,鼠标右键: 结果如下图所示: 方式2:在一个类中 结果如图:
- Android Widget开发过程中的一些问题汇总
一.基本实现要点 布局文件 配置文件 控制文件 AndroidManifest.xml
- 重拾H5小游戏之入门篇(二)
上一篇,水了近千字,很酸爽,同时表达了"重拾"一项旧本领并不容易,还有点题之效果.其实压缩起来就一句话:经过了一番记忆搜索,以及try..catch的尝试后,终于选定了Phaser ...