拦截导弹

时间限制: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. 【Maven】IKAnalyzer 在Maven Repository不存在

    1.在mvnrepository里面找IKAnalyzer,这个中文分词包,一直没有找到,找到github,发现是一个国人写的. http://mvnrepository.com/search?q=I ...

  2. 运行php程序时,浏览器跳出打开和保存提示框

    解决办法:将php.ini文件复制到 C:\Windows

  3. eclipse/STS 切换目录视图

  4. JavaScript toString、String和stringify方法区别

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. ibatis 批量更新(一)

      1.4.2.3 批量修改 支持单个动态更新.批量动态更新 <update id="updateCONSULT_SCHEDULEDynamic" parameterClas ...

  6. EXCEPTION-javaBean

      CreateTime--2016年11月24日14:29:43Author:Marydon 声明:异常类文章主要是记录了我遇到的异常信息及解决方案,解决方案大部分都是百度解决的,(这里只是针对我遇 ...

  7. 警察与小偷的实现之中的一个client与服务端通信

    来源于ISCC 2012 破解关第四题 目的是通过逆向police.实现一个thief,可以与police进行通信 实际上就是一个RSA加密通信的样例,我们通过自己编写client和服务端来实现上面的 ...

  8. java Socket Udp聊天

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...

  9. grub安装的 三种安装方式

    1. 引言 grub是什么?最常态的理解,grub是一个bootloader或者是一个bootmanager,通过grub可以引导种类丰富的系统,如linux.freebsd.windows等.但一旦 ...

  10. HDUOJ---1712 ACboy needs your help

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...