策略:
当a[i]大于l[j]中最大元素时直接添加到l[]数组末尾
否则利用二分查找比a[i]大的最小的数。并将其替换
骑士的N更大为3e5+6;
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=3e5+9;
ll a[N],l[N];
//l[i]表示长度为i+1的IS末尾元素最小值
//当定义成最小值的时候序列更容易延申
//没有重叠子问题不能算作动态规划
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int j=0;
for(int i=1;i<=n;i++)
{
if(a[i]>l[j])
{
l[++j]=a[i];
continue;
}
else{
int z=lower_bound(l+1,l+j+1,a[i])-l;
//减去l(数组地址)是为了返回目标元素的索引
//从而找到a[i]插入的位置
l[z]=a[i];
}
}
cout<<j;
return 0;
}