【动态规划】拦截导弹_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可以替代任何 ...
随机推荐
- 【CodeForces 621A】Wet Shark and Odd and Even
题 Today, Wet Shark is given n integers. Using any of these integers no more than once, Wet Shark wan ...
- RHCS配置web高可用集群
基本条件三台主机 10.37.129.5 web1.xzdz.hk web1 10.37.129.6 web2.xzdz.hk web2 10.37.129.4 luci.xzdz.hk luci 其 ...
- 重启猫(modem)的方法
重启猫(modem)的方法 家里上网还是古老的"猫+路由器"模式,换路由器后就要reset猫,其步骤为: 断开猫电源 用针头或笔尖按住reset小孔,持续30秒 针抵住小孔的同时连 ...
- 换了XCode版本之后,iOS应用启动时不占满全屏,上下有黑边
原因是没有Retina4对应的启动图片,解决方法很简单,就是把Retina4对应的图片给补上就只可以了
- POJ3714 Raid
Raid Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10625 Accepted: 3192 Description ...
- 数字证书文件格式(cer和pfx)的区别
作为文件形式存在的证书一般有这几种格式: 1.带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形 ...
- lnux下源码安装MySQL 5.6
nux下源码安装MySQL 5.6 说明:本文是我自己测试的MySQL5.6源码安装,经本人亲自实践,完全可用,另在5.6之前的版本也是可以按照本文源码安装的.我是在两台linux下一台安装5.5,另 ...
- linux学习笔记一----------文件相关操作
一.目录结构 二.文件管理操作命令(有关文件夹操作,使用Tab键自动补全文件名(如果多个默认第一个)) 1.ls 查看目录信息:ls -l 查看目录详细信息(等价于ll 某些系统不支持) 2.pwd ...
- JS 事件练习
QQ拖拽及状态栏选择 HTML <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> &l ...
- 锋利的jQuery-3--css("height")和.height()的区别
$("p").css("height") : 获取的高度值与样式的设置有关,可能会得到“auto”, 也可能是字符串“10px”之类的.设置值时如果是数值形式默 ...