题目:最长上升子序列
思路:
复杂度O(nlogn),相当于朴素dp的二分优化。
f[i]表示长度为i的最长上升子序列结尾的数。
二分用lower_bound实现。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int ans=0;
int a[10005]= {0};
int f[10005]= {0};
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
f[1]=a[1],f[0]=0;
for(int i=2;i<=n;i++) f[i]=(1<<30);
int len=1;
for(int i=2; i<=n; i++) {
if(a[i]>f[len]) {
f[++len]=a[i];
continue;
}
int x=lower_bound(f+1,f+len+1,a[i])-f;
f[x]=min(a[i],f[x]);
}
printf("%d\n",len);
return 0;
}