1010.ミサイルを迎撃する
質問リンクhttps://www.acwing.com/problem/content/1012/2
番目の質問は、実際には最長の昇順部分列を見つけることです。
#include<iostream>
#include<algorithm>
using namespace std;
int a[1010];
int f[1010];
int q[1010];
int main(){
int i=0;
while(cin>>a[i])i++;
int res=0;
for(int j=i-1;j>=0;j--){
f[j]=1;
for(int k=i-1;k>j;k--){
if(a[k]<=a[j])
f[j]=max(f[j],f[k]+1);
}
res=max(f[j],res);
}
cout<<res<<endl;
int f=0,r=-1;
for(int j=0;j<i;j++){
while(f<=r&&a[j]>q[f])f++;
if(f<=r)
q[f]=a[j];
else
q[++r]=a[j];
f=0;
}
cout<<r+1;
return 0;
}