1302 导弹拦截

来源:互联网 发布:个人日志提醒软件 编辑:程序博客网 时间:2024/05/21 06:39
 

描述

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

输入

本题有多组测试数据。输入的第一行为导弹的个数,最多10000。接下来每行为导弹依次飞来的高度(不大于30000 的正整数)

以0结尾(不做处理)

输出

对每组输入数据,输出一行,为最多拦截的导弹个数。

样例输入

6
5 3 2 4 1 3
3
3 3 3
0

样例输出

4
3

解题思路:
此题其实是一道动态规划题。可以从后往前推,记录在每一个位置处发射导弹后面最多能拦截多少导弹的个数。这样找出一个最大的数即可。此题其实也可以从前往后推,高人们可以试试。

#include <stdio.h>main(){int number,te;int a[10001];int b[10001];int i,j;int t;int max;scanf("%d",&number);while(number!=0){ for(te=1;te<=number;te++)scanf("%d",&a[te]);for(te=1;te<=number;te++)b[te]=1;         for(i=number-1;i>0;i--){t=0;for(j=number;j>i;j--){if(a[i]>=a[j]&&(b[j]+b[i])>t){t=b[j]+b[i];   continue;}}           if(t>=1)  b[i]=t;   else   continue;}         max=0;for(i=1;i<=number;i++){ if(max<b[i])max=b[i];}printf("%d\n",max);scanf("%d",&number);}}


 

原创粉丝点击