Description
某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试验阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
Input
输入数据只有一行,该行包含若干个数据,之间用半角逗号隔开,表示导弹依次飞来的高度(导弹最多有 20 枚,其高度为不大于 30000 的正整数)。
Output
输出数据只有一行,该行包含两个数据,之间用半角逗号隔开。第一个数据表示这套系统最多能拦截的导弹数;第二个数据表示若要拦截所有导弹至少要再添加多少套这样的系统。
Sample Input
389,207,155,300,299,170,158,65Sample Output
6,1
第一问还是挺简单的,就是求最长不上升子序列的长度。到了第二问就卡了我很长时间
但其实最长递增子序列的长度就是第二问的答案,因为每出现一发导弹高于前面的导弹的高度就要多一套系统
下面是ac代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n=0;
int a[21];
int b[21];
int c[21];
while(cin>>a[n]){
char c=getchar();
if(c==',')
n++;
else
break;
}//输入序列
for(int i=0;i<21;i++){
b[i]=1;
c[i]=1;
}//赋初值
for(int i=0;i<=n;i++){
for(int j=0;j<i;j++){
if(a[i]>a[j]){
b[i]=max(b[i],b[j]+1);//这里求最长递增子序列长度,即系统数
}
else
{
c[i]=max(c[i],c[j]+1);//这里求最长不递增子序列长度,即第一次能击中的到导弹数
}
}
}
int max2=*max_element(b,b+n+1);
int max1=*max_element(c,c+n+1);
cout<<max1<<','<<max2-1<<endl;
return 0;
}