分析
如果小于等于存进去的数,就加进去,大于的话就找第一个小于它的数插进去。这样子一定是最优的。
二分处理一下找第一个大于他的数。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[100001],d[100001],tot;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
d[0]=999999999;
for(int i=1;i<=n;i++)
{
if(a[i]<=d[tot])
{
d[++tot]=a[i];
}
else
{
int k=upper_bound(d+1,d+tot+1,a[i],greater<int>())-d;
d[k]=a[i];
}
}
cout<<tot;
return 0;
}