题目测评网址:戳我打开
题目:

题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入输出格式
输入格式:
一行,若干个正整数最多100个。
输出格式:
2行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入输出样例
输入样例#1:
389 207 155 300 299 170 158 65
输出样例#1:
6
2


先给大家一个提示,这里的一个系统可以先不拦截一个导弹,然后等到有可以拦截的导弹是在拦截


这题是《信息学奥赛一本通》的例9.4,先来看看书上是如何解析这道题的:

【算法分析】
第一问即经典的最长不下降子序列问题,可以用一般的DP算法,也可以用高效算法,但这个题的数据规模不需要。
  用a[x]表示原序列中第x个元素,b[x]表示长度为x的不下降子序列的长度,。当处理第a[x]时,可查找它可以连接到长度最大为多少的不下降子序列后(即与部分b[x]比较)。假设可以连到长度最大为maxx的不下降子序列后,则b[x]:=maxx+1。b数组被赋值的最大值就是第一问的答案。
  第二问用贪心法即可。每颗导弹来袭时,使用能拦截这颗导弹的防御系统中上一次拦截导弹高度最低的那一套来拦截。若不存在符合这一条件的系统,则使用一套新系统。

我的见解:第一问等同于求一个最长下降序列,这里用之前讲到过的方法来分析这题,如果你还不知道这个方法,请访问:动态规划——如何分析一道动态规划的题
发个小广告,如果你正在学习动态规划那么请关注戳我加关注。
状态表达:f[i]表示前i个数的最长下降序列。
状态转移:

for(int i = 0;i<n;i++)for(int j = 0;j<i;j++){if(num[i]>=num[j]||f[j]+1<f[i])continue;f[i] = f[j]+1;}

其中 num为输入的数。
状态数量:n个。
转移代价:O(n)
时间复杂度:O(n^2)
空间复杂度:O(n)(常数忽略)

第二是一个贪心:
举例389 207 155 300 299 170 158 65
需要2个系统。
第一个系统:389 207 155 65
第二个系统:300 299 170 158
这里可以发现,65这个导弹在两个系统都可以捕捉到的情况下属于了第一个系统,再举例:389 207 155 300 299 170 158 65 66 63
需要2个操作系统。
第一个系统:389 207 155 65 64 63
第二个系统:300 299 170 158
这里可以发现,贪心策略是,当一个导弹不能被已有系统拦截是,新开一个系统,当一个导弹可以被多个系统拦截时,选择那个最低值离导弹最近的系统。
代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>int num[1001],f[1001],p[1001];
std::vector<int> lower;bool find(int x)
{std::sort(lower.begin(),lower.end());for(int i = 0;i<lower.size();i++)if(lower[i]>x){lower[i] = x;return true;}return false;
}int main()
{int n = 0,ans = -1;while(scanf("%d",&num[n])!=EOF)n++;for(int i = 0;i<n;i++)for(int j = 0;j<i;j++){if(num[i]>=num[j]||f[j]+1<f[i])continue;f[i] = f[j]+1;}for(int i = 0;i<n;i++)ans = std::max(ans,f[i]);std::cout<<ans+1<<std::endl;for(int i = 0;i<n;i++){if(find(num[i])==false)lower.push_back(num[i]);}std::cout<<lower.size();return 0;
}

转载于:https://www.cnblogs.com/powerLEO101/p/7695187.html

动态规划——洛谷1020_导弹拦截(1999年的)相关推荐

  1. 洛谷1020导弹拦截

    Dilworth定理的证明:http://www.cnblogs.com/nanke/archive/2011/08/11/2134355.html 感觉难理解.有空研究. #include<i ...

  2. 洛谷 [P1020] 导弹拦截 (N*logN)

    首先此一眼就能看出来是一个非常基础的最长不下降子序列(LIS),其朴素的 N^2做法很简单,但如何将其优化成为N*logN? 我们不妨换一个思路,维护一个f数组,f[x]表示长度为x的LIS的最大的最 ...

  3. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  4. [动态规划] 洛谷P1064 金明的预算方案

    洛谷P1064 金明的预算方案 题意: 每件物品都有一定的满意度,而且物品分主件附件,要买附件就必须要买主件,但是买主件不一定要买附件(一个主件最多有两个附件,也可能没有喔) 设第j件物品的价格为v[ ...

  5. 洛谷P1020:导弹拦截

    P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题其实是两个问题的结合,可以互不干扰地求出. 第一个问题,NOPI里是可以用o ...

  6. 洛谷P1020/CODEVS1044 导弹拦截(拦截导弹)

    本题地址: http://www.luogu.org/problem/show?pid=1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的 ...

  7. 导弹拦截(洛谷-P1020)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  8. Java实现 洛谷 导弹拦截

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  9. 洛谷P2904 [USACO08MAR]跨河River Crossing 动态规划

    洛谷P2904 [USACO08MAR]跨河River Crossing 动态规划 区间DP f[ i ] 表示 将 i 头牛 运了过去,然后John 又返回所需要的最少时间 1 #include & ...

  10. 洛谷P1133 教主的花园 动态规划

    洛谷P1133 教主的花园 动态规划 这里是环状的,但是我们并不用将他破环成链 只要枚举第一个点 根据第一个点选择最后一个选择什么就行了 然后我们进行DP 注意如果当前是 2 的话要分情况 上一次是上 ...

最新文章

  1. 结棍!Spring 支持 PHP 了!?
  2. 一起撸个朋友圈吧 图片浏览(上)【图片点击前景色】
  3. java 日期calendar_java时间对象Date,Calendar和LocalDate/LocalDateTime
  4. [转]测试淘宝站内的搜索系统
  5. 线性时间选择_马鞍山非线性分析工具了解详情_南京凯安软件
  6. fastscript传递参数
  7. 【论文投稿】SOTA论文也未必能被接收,谷歌科学家Eric Jang谈顶会审稿标准
  8. 启动报错:Error creating bean with name ‘XXX’ defined in...
  9. JavaScript模块化编程之AMD
  10. 18._6索引器在接口中的使用
  11. Rust: flat_map、filter_map、for_each
  12. 抖音短视频数据分析报告工具
  13. 百度云盘批量转存工具使用教程
  14. IOS开发之——音乐播放器-资源和Model(02)
  15. 《当程序员的那些狗日日子》(八)床上等你
  16. 如何在线引入 阿里巴巴矢量图标库?
  17. 【渝粤教育】电大中专电子商务网站建设与维护 (5)作业 题库
  18. object标签属性详解
  19. Java_最不重要位替换(LSB)基于24位BMP图片
  20. Thinkphp框架初始及安装部署

热门文章

  1. [渝粤教育] 西南科技大学 机电传动控制 在线考试复习资料
  2. Python笔试题汇总
  3. 求解偏微分方程开源有限元软件deal.II学习--Step 11
  4. Python import其他文件夹的文件
  5. 在windows Console 平台下面 用glut编写 opengl程序 注意
  6. 看完这篇再不会 View 的动画框架,我跪搓衣板
  7. Oracle常用CURD
  8. so文件(1)简单的导出使用
  9. 索引大小对语句执行速度的影响
  10. vue 挂载点 实例 模板