Problem Description: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。怎么办呢?请帮助计算一下最少需要多少套拦截系统? Input: 输入若干组数据(不超过100组),每组数据一行,分别为:导弹总个数(正整数,不超过1000),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)。 Output: 对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统。 Sample Input: 8 389 207 155 300 299 170 158 65 Sample Output: 2 解题分析: 可看作求最长不降子序列。 AC代码:
#include <iostream> #include <cstdio> using namespace std; int LIS(int A[],int n) { int* d = new int[n]; int len = 1; int i,j; for(i=0;i<n;i++) { d[i]=1; for(j=0;j<i;j++) { if(A[j]<A[i] && (d[j]+1)>=d[i]) d[i]=d[j]+1; } if(d[i]>len) len=d[i]; } delete []d; return len; } int main() { int n,i,a[1005],l; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); l=LIS(a,n); printf("%d\n",l); } return 0; }