防卫导弹(动态规划入门题)

原创 2006年06月16日 20:29:00

一种新型的防卫导弹可截击多个攻击导弹.它可以向前飞行,也可以用很快的速度向下飞行,可以毫无损伤地截击进攻导弹,但不可以向后或向上飞行.但有一个缺点,尽管它发射时可以达到任意高度,但它只能截击比它上次截击导弹时所处高度低或者高度相同的导弹.现对这种新型 防卫导弹进行测试,在每一次测试中,发射一系列的测试导弹(这些导弹发射的间隔时间固定,飞行速度相同),该防卫导弹所能获得的信息包括各进攻导弹的高度,以及它们发射次序.现要求编一程序,求在每次测试中,该防卫导弹最多能截击的进攻导弹数量,一个导弹能被截击应满足下列两个条件之一:
它是该次测试中第一个被防卫导弹截击的导弹;
它是在上一次被截击导弹的发射后发射,且高度不大于上一次被截击导弹的高度的导弹.
输入格式:
从当前目录下的文本文件"CATCHER.DAT"读入数据.该文件的第一行是一个整数N(0〈=N〈=4000),表示本次测试中,发射的进攻导弹数,以下N行每行各有一个整数hi(0〈=hi〈=32767),表示第i个进攻导弹的高度.文件中各行的行首,行末无多余空格,输入文件中给出的导弹是按发射顺序排列的.
输出格式:
答案输出到当前目录下的文本文件"CATCHER.OUT"中,该文件第一行是一个整数max,表示最多能截击的进攻导弹数,以下的max行每行各有一个整数,表示各个被截击的进攻导弹的编号(按被截击的先后顺序排列).输出的答案可能不唯一,只要输出其中任一解即可.

 题目讲得很麻烦,归根结底就是求一整串数中的最长不上升序列 ,用一个一维数组Max[ i ]来建立动态规划状态转移方程,表示表示当前状态(从i 到n)最多可击落的导弹数,用next[i]表示当前节点的后继标志:

#include<iostream>
#include<string>
using namespace std;
int h[4001],Max[4001],next[4001];

int main()
 {
     freopen("in.txt","r",stdin);
     freopen("out.txt","w",stdout);
     int n,head,i,j,maxnum;
     while(cin>>n)
      {
          for(i=1;i<=n;i++)
            cin>>h[i];
          maxnum=0;
          for(i=n;i>=1;i--)
           {
              Max[i]=1;
              next[i]=0;
              for(j=i+1;j<=n;j++)
                if(h[i]>=h[j])
                 if(Max[i]<Max[j]+1)
                   {
                      Max[i]=Max[j]+1;
                      next[i]=j;
                   }
             if(Max[i]>maxnum)
                  {
                     maxnum=Max[i];
                     head=i;
                  }         
                      
           } 
         cout<<maxnum<<endl;
         while(head!=0)
           {
               cout<<head<<endl;
               head=next[head];
           }        
        cout<<endl;       
             
      }   
     return 0;
 }   

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

机试算法讲解:第50题 动态规划之拦截导弹

/* 问题:拦截导弹。导弹系统有缺陷,后面炮弹高度<=前一发高度。计算系统能拦截多少导弹。拦截时,必须按照时间顺序,不允许先拦截后面的导弹再拦截前面的导弹。 输入:每组输入两行。第一行:导弹数量k(k...

nyist oj 79 拦截导弹 (动态规划基础题)

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

【NOIP】CODE[VS] 1044 拦截导弹 动态规划 序列型DP

NOIP 1999 ,上世纪的题233,有点久远但很经典qwqqq (扯淡)—————–华丽丽的分割线—————— 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但...

动态规划 拦截导弹

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

算法训练 拦截导弹(动态规划)

算法训练 拦截导弹   时间限制:1.0s   内存限制:256.0MB        锦囊1 贪心和动态规划算法。 问题描述   某国为了防御敌国的导弹袭击,发展出一种导弹拦截系...

[DP动态规划]导弹拦截 - 1999年NOIP普及组

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

NYOJ - 79 - 拦截导弹(动态规划--LIS--最长递增子序列变形)

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

cugb 1050 导弹拦截(动态规划,LIS)

听说这个这个呢~~~是动态规划的典型类题,叫最长上升子序列(LIS),但这个题是最长不上升子序列,原理一样哈,那就来分析一下~~ LIS: 有一串数,比如1 3 5 7 9 2 4 6 8,求最长...

清橙 A1120 拦截导弹 -- 动态规划(最长上升子序列)

题目地址:http://oj.tsinsen.com/A1120 问题描述   某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能...
  • JDPlus
  • JDPlus
  • 2014-03-04 15:04
  • 1533
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)