拦截导弹

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述

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

 
输入
第一行输入测试数据组数N(1<=N<=10)
接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20)
接下来行输入导弹依次飞来的高度,所有高度值均是大于0的正整数。
输出
输出最多能拦截的导弹数目
样例输入
2
8
389 207 155 300 299 170 158 65
3
88 34 65
样例输出
6
2

【问题分析】

方法一:

有经验的不难看出这是一个求最长非升子序列问题,显然标准算法是动态规划。

以导弹依次飞来的顺序为阶段,设计状态opt[i]表示前i个导弹中拦截了导弹i可以拦截最多能拦截到的导弹的个数。

状态转移方程:

opt[i]=max(opt[j])+1  (h[i]>=h[j],0=<j<i)   {h[i]存,第i个导弹的高度}

最大的opt[i]就是最终的解。

代码如下:
 #include<stdio.h>
#include<string.h>
int main()
{
int t,n,max,i,ans,j,a[],count,opt[];
scanf("%d",&t);
while(t--)
{
ans=;
memset(opt,,sizeof(opt));//把所有的都opt都变成0
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%d",&a[i]);
for(i=;i<n;i++)
{
for(j=;j <= i-;j++)//每次都从第一个开始判断,判断到小于i,
{
if(a[j]>a[i] && opt[j]+>opt[i])//当出现后一个小于前一个时,那个数所在的长度加上一,后面的这个判断不能省,具体原因如下
{
opt[i]=opt[j]+;
}
}
}
for(i=;i<n;i++)
if(opt[i]>ans)//筛选出长度最大的那一个
ans=opt[i];
printf("%d\n",ans+);
}
return ;
}

当出现8 7 9 6  所对应的长度如下
        0 1 0 ?假如不省的话应该是2,如果省会变成3的,这样的话就错误了;
当执行一次时6小于8,6的位置变成了1,再一次执行6小于7,并且opt[j]+1=2,而opt[i]=1,所以继续执行,

当和9比较时9的位置为0,即opt[j]+1=1依然小于2,所以下面的不再这行了,所以必须要有这一个判断
 
方法二:转移到另一个数组中
有一组特殊数据 7 6 5 6 5结果应该是3 而错误的是4
 AC程序

     #include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,t,a[],b[],n,m,f;
scanf("%d",&t);
while(t--)
{
memset(b,,sizeof(b));
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%d",&a[i]);
b[]=a[];
for(i=,m=;i<n;i++)
{
if(a[i]<b[m-])
b[m++]=a[i];
else
{
for(j=;j<m;j++)
if(a[i]>b[j] && j== )
{ b[j]=a[i];break;}
else if(a[i]>b[j] && a[i]<b[j-])
{ b[j]=a[i];break;}
}
}
// for(i=0;i<m;i++)
// printf("%d ",b[i]);
printf("%d\n",m);
}
return ;
}
错误的写法
 #include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,t,a[],b[],n,m;
scanf("%d",&t);
while(t--)
{
memset(b,,sizeof(b));
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%d",&a[i]);
b[]=a[];
for(i=,m=;i<n;i++)
{
if(a[i]<b[m-])
b[m++]=a[i];
else
{
for(j=;j<m;j++)
if(a[i]>b[j])//如果这一步出现替换将会出现7 6 6 5,所以是4
{ b[j]=a[i];break;}
}
}
printf("%d\n",m);
}
return ;
}

ny79 拦截导弹的更多相关文章

  1. codevs1409 拦截导弹2

    [问题描述]一场战争正在 A 国与 B 国之间如火如荼的展开.B 国凭借其强大的经济实力开发出了无数的远程攻击导弹,B 国的领导人希望,通过这些导弹直接毁灭 A 国的指挥部,从而取得战斗的胜利!当然, ...

  2. nyoj814_又见拦截导弹_DP

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

  3. 【动态规划】拦截导弹_dilworth定理_最长递增子序列

    问题 K: [动态规划]拦截导弹 时间限制: 1 Sec  内存限制: 256 MB提交: 39  解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...

  4. ACM题目————又见拦截导弹

    描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮 ...

  5. nyoj------79拦截导弹

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

  6. 百练_2945 拦截导弹(DP)

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

  7. nyoj 79 拦截导弹

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

  8. bzoj 2244: [SDOI2011]拦截导弹 cdq分治

    2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 237  Solved: ...

  9. tyvj P1209 - 拦截导弹 平面图最小割&&模型转化

    P1209 - 拦截导弹 From admin    Normal (OI)总时限:6s    内存限制:128MB    代码长度限制:64KB 背景 Background 实中编程者联盟为了培养技 ...

随机推荐

  1. break的使用方法

    private static void test() {  for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { Syst ...

  2. Linq to Entity调用存储过程【转】

    http://www.cnblogs.com/chenxizhang/archive/2010/01/03/1638201.html

  3. JSON path

    https://github.com/itguang/gitbook-smile/blob/master/springboot-fastjson/fastjson%E4%B9%8BJSONPath%E ...

  4. FPGA视频拼接器的DP 的4k 功能输入, 把lvds 转为 serdes

    4k(3840 x 2160 @60hz)越来越成为一种视频趋势,怎样把4K 接入到拼接器中.是一个棘手的问题. 先看一下原理图的接口: 这是 anx1122的 lvds的接口. 以下看一下系统的框架 ...

  5. UIkit – 轻量级前端框架

    原始地址:UIkit – 轻量级前端框架 高效轻量级前端框架: 来自:咕噜分享

  6. HDU 5358 First One(枚举)

    这道题假设依照表达式一个个来算肯定超时,下午时候想了一个O(nlogn*logn)的算法.可是t了.由于这道题卡的很紧几百个例子,必须nlogn的算法才干够ac 回到这道题,考虑log(sum(i,j ...

  7. iOS开发-使用宏自定义输出(NSLog)

    前言: 1)输出日志是会大量损耗系统性能 2)输出的信息很容易会被截取到,导致信息不安全. 所以我们会在发行版(Release)取消所有的Log.如果一行一行地去注释掉Log,显然不是一个明确的选择. ...

  8. 【LeetCode】136. Single Number (4 solutions)

    Single Number Given an array of integers, every element appears twice except for one. Find that sing ...

  9. Java IDE选择,常用Java IDE排行榜

    Java IDE众多,java开发主要用.最多用.国内较流行.本人常用的java IDE如下: 开发java大项目的IDE一般都用eclipse或netbeans(几乎我所在的公司都是在用eclips ...

  10. [Python]项目打包:5步将py文件打包成exe文件(转)

    1.下载pyinstaller并解压(可以去官网下载最新版): http://nchc.dl.sourceforge.net/project/pyinstaller/2.0/pyinstaller-2 ...