拦截导弹

时间限制: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. angular中如何监控dom渲染完毕

    刚刚看到群上一个人说,他们公司凡是用angular和jquery插件一起用的人,都被解雇了,没看到这句话之前我很惭愧的说我有这样用过,其实angular的生态系统那么完善,完全可以不用去操作任何的do ...

  2. Speculative Execution in Hadoop

    来自:http://blog.csdn.net/macyang/article/details/7880671 所谓的推测执行,就是当所有task都开始运行之后,Job Tracker会统计所有任务的 ...

  3. An application icon

    The application icon is a small image which is usually displayed in the top left corner of the title ...

  4. PHPstorm最常用的快捷键,提高开发效率

    PHPstorm最常用的快捷键,提高开发效率 •ctrl+b 跳到变量申明处 •Ctrl + E 打开最近文件 •Ctrl + R 替换. •Ctrl + D 复制粘贴.将当前行或者选择的内容复制粘贴 ...

  5. java两种同步机制的实现 synchronized和reentrantlock

    java两种同步机制的实现 synchronized和reentrantlock 双11加保障过去一周,趁现在有空,写一点硬货,因为在进入阿里之后工作域的原因之前很多java知识点很少用,所以记录一下 ...

  6. XMPP serverejabberd-14.12本地搭建

    这里记录下我搭建ejabberd-14.12的过程. 首先下载:http://pan.baidu.com/s/1hqzjezq  这里我传到我的网盘一份, 大家也能够到官网下载http://xmpp. ...

  7. 判断URL是否支持断点续传?

    #python #xiaodeng #判断URL是否支持断点续传? import urllib2 req = urllib2.Request('http://ftp.ubuntu.com/') req ...

  8. BasicAuth和OAuth

    参考资料 百度百科BasicAuth 维基百科OAuth BasicAuth基本授权 BasicAuth又叫HttpAuth,它非常简单.例如你访问一个页面时,会弹出用户名密码框 它的优点是:简单,只 ...

  9. LeetCode-342:Power of Four

    This  is another  "Pick One" Problem :[Problem:342-Power of Four] Given an integer (signed ...

  10. Setting up a static IP address in Ubuntu

    sudo gedit /etc/network/interfaces Change the line iface eth0 inet dhcp to iface eth0 inet static an ...