最少拦截系统
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
Input
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)
Output
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.
Sample Input
8 389 207 155 300 299 170 158 65
Sample Output
2
题解 :最长递增子序列,假如序列递减,则最长递增子序列是1,
那么如果要两套系统,必然是递增子序列是2,仔细想想,那么直接用最长递增子序列就能过。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 #include<string.h> 3 int a[100001]; 4 int dp[100001]; 5 int max(int a,int b) 6 { 7 return a>b?a:b; 8 } 9 int main() 10 { 11 int n; 12 while(scanf("%d",&n)!=EOF) 13 { 14 for(int i=0;i<n;i++) 15 scanf("%d",&a[i]); 16 memset(dp,0,sizeof(dp)); 17 int res=0; 18 for(int i=0;i<n;i++) 19 { 20 dp[i]=1; 21 for(int j=0;j<=i;j++) 22 { 23 if(a[i]>a[j]) 24 { 25 dp[i]=max(dp[i],dp[j]+1); 26 } 27 res=max(res,dp[i]); 28 } 29 } 30 printf("%d\n",res); 31 } 32 return 0; 33 }