Description

某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试验阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

Input

输入数据只有一行,该行包含若干个数据,之间用半角逗号隔开,表示导弹依次飞来的高度(导弹最多有  20  枚,其高度为不大于  30000  的正整数)。

Output

输出数据只有一行,该行包含两个数据,之间用半角逗号隔开。第一个数据表示这套系统最多能拦截的导弹数;第二个数据表示若要拦截所有导弹至少要再添加多少套这样的系统。

Sample Input

389,207,155,300,299,170,158,65

Sample Output

6,1

最近渐渐开始系统的接触一些基础的dp问题。本题就是一个比较经典的dp问题,了解了题意便是求一个最长不升子序列的长度。用一维的dp来表示答案。dp的关键在于状态转移方程。

第一问:设dp[i]来表示从0~i的能拦截的最多导弹数。在考虑第i个导弹时,先应该在0~i中找比第i个导弹高的那些导弹个数,用j去遍历,0<=j<i的导弹中,取比第i个导弹高那些中最大的dp[j](即0~i-1之中最多能打掉的导弹数,满足最优子结构)再加一。最后遍历所有找出最大的dp[i]即为所求。

错误思路(第一段代码中的nex数组):
第二问:第二题的思路和第一题本质基本上一样,只需要反一反。同样用nex[i]数组来存0~i之中需要被打最少的次数。在考虑第i个导弹时,如果比前面的导弹更高,那么就需要多一次打掉。而去遍历0~i-1的过程中,找到比i矮之中最大的nex[j]+1(即0~i-1中比i矮的最多打的次数还打不掉,需要多加一次),同样找出max(nex[i])即可。
正确思路(第二段代码中的正确dp):
利用贪心的思想,用dp[i]表示当前第i个拦截系统最低能打落的导弹高度。遍历每一颗导弹,从之前所有的拦截系统之中找到能把它打掉(dp[j]>=a[i])并且是距离当前高度a[i],高度差最小的一个拦截系统(贪心思想),若数据量大也可以用二分来找(整个dp数组是单调递增的。因为前一个拦截系统的最低高度肯定后一个拦截系统的最低高度来的低(贪心思想),只有更高的导弹才会开新系统)比倘若之前所有的都不能打掉就新开一个拦截系统。
代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=4e3+5;
int a[25],dp[25],nex[25];
int main(int argc, char** argv) {char ch;int n=0;while(scanf("%d%c",&a[n++],&ch))if(ch=='\n') break;memset(dp,0,sizeof(dp));memset(nex,0,sizeof(nex));nex[0]=0;   for(int i=0;i<n;i++){int temp=0,tmp=0;dp[i]=1,nex[i]=1;for(int j=i-1;j>=0;j--){if(a[j]>=a[i] && temp<dp[j]){        //找0~i-1比i高的那些导弹中(它们都能打掉i)最多能打掉的个数加一temp=dp[j];}if(a[j]<a[i] && tmp<nex[j]){         //找0~i-1比i低的那些导弹中(它们都打不掉i)最多需要打掉次数再加一tmp=nex[j];}}dp[i]=temp+1,nex[i]=tmp+1;}
//      for(int i=0;i<n;i++)
//          cout<<next[i]<<' ';int ans=0;for(int i=0;i<n;i++){ans=max(dp[i],ans); }int cnt=0;for(int i=0;i<n;i++){cnt=max(nex[i],cnt);}
//cnt是错误答案.
printf("%d,%d\n",ans,cnt-1);return 0;
}

求最少拦截系统数

#include <iostream>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e5+5;
int dp[maxn],a[maxn];
int main(int argc, char** argv) {int n;while(~scanf("%d",&n)){memset(dp,0,sizeof(dp));for(int i=0;i<n;i++){scanf("%d",&a[i]);}int i=0,ans=0,temp=0;dp[0]=a[0];while(i<n){int flag=0,min=INF;for(int j=1;j<=ans;j++){if(dp[j]>=a[i] && dp[j]-a[i]<min){temp=j;min=dp[j]-a[i];flag=1;}}if(flag) dp[temp]=a[i];else   dp[++ans]=a[i];i++;}//for(int i=1;i<=ans;i++) cout<<dp[i]<<' ';cout<<endl;cout<<ans<<endl;}return 0;
}

vijos p1303 拦截导弹相关推荐

  1. Vijos P1303 导弹拦截【最长上升子序列+DP】

    背景 实中编程者联盟为了培养技术精湛的后备人才,必须从基础题开始训练. 描述 某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度, ...

  2. BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治

    2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...

  3. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  4. BZOJ2244 [SDOI2011]拦截导弹 【cdq分治 + 树状数组】

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

  5. 1044 拦截导弹——http://codevs.cn/problem/1044/

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

  6. 动态规划之——又见拦截导弹(nyoj814)

    问题描述: 又见拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一 ...

  7. 动态规划之——拦截导弹(nyoj79)

    问题描述: 拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮 ...

  8. NYOJ 79 拦截导弹

    拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任 ...

  9. P2487 [SDOI2011]拦截导弹(cdq分治/计数问题思想)

    P2487 [SDOI2011]拦截导弹 求解二维上的LIS,并且要求出每个点的选中概率. 首先对于每个点的选中概率,可以通过方案数计算,那么就是选中它的方案数除以总方案数.关键在于选中它的方案数怎么 ...

最新文章

  1. 十几年后我才知道,嫁了一个硬核老公
  2. python numpy安装-Numpy安装
  3. 无法添加选择的Web部件
  4. sql取字段前4位_4千左右预算,2020年Word/Excel/用友/ 金蝶/SQL数据库-财务会计轻薄笔记本推荐...
  5. 成都高端企业网站建设前网站推广优化战略规划成都辰星建站
  6. OS51技术 GHOSTXP SP3 OEM V7.0 驱动增强纯净版(20130629)
  7. C++求解组合数的具体实现
  8. linux socket cups,Linux打印系统CUPS原理分析
  9. 华为MH5000模块知识应用简介
  10. CSS高级篇——属性选择器 (attribute selectors)
  11. 万兆局域网方案_万兆内网初体验
  12. 十个高质量工具网站推荐,AI自动抠图换背景,任意背景自动融合
  13. 数字图像处理第八章----图像压缩
  14. 计算机电源怎么设置玩游戏不卡,端游绝地求生怎么设置不卡
  15. linux万能显卡,Linux N卡驱动年终盘点:干得漂亮
  16. ROS之游戏手柄控制小乌龟移动
  17. 西门子S7-200模拟量编程
  18. 苹果原壁纸高清_苹果X壁纸 | 全面屏壁纸高清
  19. 控件添加与不添加runat=server的作用及区别
  20. Android问题(二)

热门文章

  1. Vue和React代码检测工具
  2. windows下Oracle11报错:ora-01034 ora-27101 ora-00600
  3. Cannot start process, the working directory ‘D:\Users\qyp\PycharmProjects\py---pycharm报错
  4. 7款高效、好用、免费的Mac工具!好用到炸系列
  5. 听说做餐饮的都在赔钱,为什么新店却越开越多?
  6. Idea格式化快捷键无效,没反应
  7. Oracle中In函数的使用
  8. C++中WINAPI函数参数中的IN和OUT
  9. 微信朋友圈视频怎么编辑比较好
  10. 异性员工避免封闭空间独处、单独约饭、肢体接触,万亿级公司竟然这样规定!!!...