思路:
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int N=1010;
int f[N],a[N];
int q[N];//q[i] 长度为i的子序列结尾的值
int main(){
while(cin>>a[n]) n++;
//cnt表示数组里面子序列的数量 最少几个子序列可以Cover导弹
int cnt=0;
int res=0;
for(int i=0;i<n;i++){
f[i]=1;
for(int j=0;j<i;j++){
//最长下降子序列
if(a[i] <= a[j]){
f[i]=max(f[i],f[j] + 1);
}
res=max(res,f[i]);
}
int k=0;
//在q数组里面找到最小的大于a[i]的子序列结尾
while(k<cnt && q[k] < a[i]) k++;
q[k]=a[i];
if(k>=cnt) cnt++;
}
cout<<res<<endl<<cnt<<endl;
return 0;
}
评论区