【动态规划】拦截导弹_dilworth定理_最长递增子序列
问题 K: 【动态规划】拦截导弹
时间限制: 1 Sec 内存限制: 256 MB
提交: 39 解决: 10
[提交][状态][讨论版]
题目描述
墨老师:“修罗是佛家用语,修罗毕生以战斗为目标,修罗场指的是他们之间的死斗坑,人们通常用‘修罗场’来形容惨烈的战场。后来又引申出‘一个人在困境中做绝死奋斗’的意思。所以,这其实也在暗示我们,即使是身处绝境,也不要放弃奋斗。再说了,情况其实没有这么糟糕,因为我们最新的导弹拦截系统已经研制好了。”
魔法世界为了防御修罗王军团的导弹袭击,开发出一种导弹拦截系统──“要你命3000”。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到修罗王军团的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000 的正整数),计算这套系统最多能拦截多少导弹和如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入
一行,为导弹依次飞来的高度
输出
行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数
样例输入
389 207 155 300 299 170 158 65
样例输出
6
2 解题思路:题目所给的数据并不知道数量,所以添加一个字符,genchar()获取字符判断是不是空格,是空格说明后面还有数据,继续读入整数。
char cc;
cin>>a[n++];
while((cc=getchar())==' '){
cin>>a[n++];
}
本来我是用的cc=getchar()!=‘\n’,结果提交oj,显示超时,程序根本停不下。所以不知道一行的最后用什么结束的,但改成只要不等于空格就结束,就可以了。
最多能拦截的导弹数很容易明白,就是求最长非递增子序列。
最少要配备的系统数,刚开始我以为只要后面一个数比前面一个数大,然后c++,最后得到的就是要配备的系统数呢。
但7 8 9 2 1 3 4 5这几个数就不可以,得到的是5,但结果应该是4。 5虽然比4大,但是他可以被打掉9的导弹打掉。所以5就不用再计入了。
后来百度一下,应该是求最长递增子序列才行。
然后证明这个好像是什么dilworth定理(最少链划分 = 最长反链长度)。
这个还不太懂,一会再看看。
还有个理解的方法,这个序列可以挑出很多递增子序列来,找一个不是最长的,再看他后面可能还有一个比这个序列中大的一个数,这个数也要消耗一个导弹。所以得找最长递增子序列才能打掉所有导弹。
代码:
#include <iostream>
#include <cstdio> using namespace std; int main()
{
int n=;
int a[];
int sum[];
int sum2[];
int c=;//储存下一个高度比上一个高度大的情况数量
int maxx;
int maxx2;
int ans=;
int ans2=;
char cc;
cin>>a[n++];
while((cc=getchar())==' '){
cin>>a[n++];
}
sum[]=;
sum2[]=;
for(int i=;i<n;i++){
maxx=;
maxx2=;
for(int j=;j<i;j++){
if(a[j]>=a[i]){
maxx=max(maxx,sum[j]);
}
if(a[j]<a[i]){
maxx2=max(maxx2,sum2[j]);
}
}
sum[i]=maxx+;
ans=max(ans,sum[i]);
sum2[i]=maxx2+;
ans2=max(ans2,sum2[i]);
}
printf("%d\n%d",ans,ans2);
return ;
}
【动态规划】拦截导弹_dilworth定理_最长递增子序列的更多相关文章
- 九度OJ 1112:拦截导弹 (DP、最长下降子序列)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3124 解决:1525 题目描述: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能 ...
- 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
一, 最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...
- hdu1257最少拦截系统 动态规划(最长递增子序列(LIS))
Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高 ...
- 算法之动态规划(最长递增子序列——LIS)
最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...
- 动态规划之最长递增子序列(LIS)
在一个已知的序列{ a1,a2,……am}中,取出若干数组成新的序列{ ai1, ai2,…… aim},其中下标 i1,i2, ……im保持递增,即新数列中的各个数之间依旧保持原数列中 ...
- HDU 1257 最少拦截系统 最长递增子序列
HDU 1257 最少拦截系统 最长递增子序列 题意 这个题的意思是说给你\(n\)个数,让你找到他最长的并且递增的子序列\((LIS)\).这里和最长公共子序列一样\((LCS)\)一样,子序列只要 ...
- 动态规划 - 最长递增子序列(LIS)
最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...
- 【动态规划】【二分】【最长上升子序列】Vijos P1028 魔族密码
题目链接: https://vijos.org/p/1028 题目大意: 给N个字符串(N<=2000),求能组成词链的单词最多有几个. 如果在一个由一个词或多个词组成的表中,除了最后一个以外, ...
- 【动态规划】【二分】【最长上升子序列】HDU 5773 The All-purpose Zero
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5773 题目大意: T组数据,n个数(n<=100000),求最长上升子序列长度(0可以替代任何 ...
随机推荐
- Oracle导出导入数据库的方式
一.导入导出.dmp文件 利用cmd的操作命令导出,详情如下(备注:方法二是转载网上的教程):1:G:\Oracle\product\10.1.0\Client_1\NETWORK\ADMIN目录下有 ...
- bzoj 1193 贪心
如果两点的曼哈顿距离在一定范围内时我们直接暴力搜索就可以得到答案,那么开始贪心的跳,判断两点横纵坐标的差值,差值大的方向条2,小的条1,不断做,直到曼哈顿距离较小时可以暴力求解. 备注:开始想的是确定 ...
- vbox下安装arch
http://tieba.baidu.com/p/2663744019 安装介质: archlinux-2013.10.01-dual.iso 准备存储设备: 警告: 磁盘分区有时会毁掉原分区内的数据 ...
- BZOJ-3282 Tree Link-Cut-Tree(似乎树链剖分亦可)
蛋蛋用链剖A的,我写的LCT 3282: Tree Time Limit: 30 Sec Memory Limit: 512 MB Submit: 1241 Solved: 542 [Submit][ ...
- BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤
3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...
- javaScript基础练习题-下拉框制作
1.基础回顾 如何让一个段javascript在文档加载后执行,(因为自己忘了,所以顺便复习一下) window.onload = function(){}; <!DOCTYPE html PU ...
- 【干货】Laravel --Validate (表单验证) 使用实例
前言 : Laravel 提供了多种方法来验证应用输入数据.默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验 ...
- ci 4.2
超级对象 $this 当前的控制器对象 有很多属性 $this->load 装载器类的实例在systme/core/loader.php 里面有view方法 $obj = new CI_ ...
- Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南
Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用 ...
- hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
题意: 求解最大递增子序列. 例如:3 1 3 2 输入 3 个数 1 3 2 则递增子序列有 {1} {3} {2} {1 3} {1 2} ,故输出子序列的最大和 4 解题思路: x[n](n个 ...