分析
上升子序列最后一个值越小,后面未加入到上升子序列的值就更容易加入到上升子序列中,也就可以使子序列长度最长。所以当上升子序列的最后一个值越小时,我们更可能找到最长的上升子序列。
思路
数组f[n]存储的是长度为n的上升子序列的最后一个值,当上升子序列长度相同时,我们选择最后一个值最小的存储。
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],q[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
q[0]=-2e9;//哨兵作用
int len=0;
for(int i=0;i<n;i++)
{
int l=0,r=len;
while(l<r)//找小于a[i]的最大的数 插入到哪一个序列后面
{
int x=l+r+1>>1;
if(q[x]>=a[i]) r=x-1;
else l=x;
}
q[r+1]=a[i];//插入到序列后面 即第r+1个位置
len=max(len,r+1);
//printf("%d ",len);
}
//for(int i=0;i<n;i++) printf("%d ",q[i]);
printf("%d",len);
return 0;
}