某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。
Input
输入有两行,
第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),
第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。
第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),
第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。
Output
输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。
Sample Input
8 300 207 155 300 299 170 158 65Sample Output
6
1 //动态规划算法 2 3 #include <stdio.h> 4 #include <string.h> 5 6 #define MAX 30 7 8 int main() 9 { 10 int k; 11 int high[MAX]; //存入每个导弹的高度 12 //以第i颗导弹作为最后一个拦截目标, 13 //并将此种状态下能拦截的导弹数量 14 //存入数组maxNum[i] 15 int maxNum[MAX]; 16 int max; 17 int i,j; 18 scanf("%d",&k); 19 for (i=1; i<=k; i++) 20 { 21 scanf("%d",&high[i]); 22 } 23 memset(maxNum,0,sizeof(maxNum)); 24 for (i=1; i<=k; i++) 25 { 26 for (j=1; j<=i; j++) 27 if (high[j]>=high[i]&&maxNum[j]>=maxNum[i]) 28 maxNum[i] = maxNum[j]; 29 maxNum[i] += 1; 30 } 31 max = maxNum[1]; 32 for (i=2; i<=k; i++) 33 if (maxNum[i]>max) 34 max = maxNum[i]; 35 printf("%d",max); 36 37 38 return 0; 39 }