895. 最长上升子序列
题目链接https://www.acwing.com/problem/content/897/
题目:
方法一:dp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[1010],c[1010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int res=0;
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(a[j]<a[i])
c[i]=max(c[i],c[j]);
}
c[i]+=1;
res=max(res,c[i]);
}
cout<<res;
return 0;
}
方法二:单调队列
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[1010],k;
int erfen(int u){
int l=0,r=k;
while(l<r){
int mid=l+r+1>>1;
if(a[mid]<u) l=mid;
else r=mid-1;
}
return l;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int t;
scanf("%d",&t);
int index=erfen(t);
a[++index]=t;
k=max(k,index);
}
cout<<k;
return 0;
}