解题思路:
学习了lower_bound()函数,该函数的作用:把一个数放于一个序列中最早插入的哪个位置i,前i-1个数逗比该数大。
具体请看https://blog.youkuaiyun.com/tjpuacm/article/details/26389441。
用该函数,就能找到一个序列中排列最紧密的一组数,也就是数字之间相隔最近(前提:数字的相对位置不变),这样就可以计算出最长子序列啦!
源码附上:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=50000;
long long S[maxn],A[maxn];
int main()
{
int N,i;
cin>>N;
for(i=0;i<N;i++)
{
cin>>S[i];
}
int len=0;
A[len++]=S[0];
for(i=1;i<N;i++)
{
if(S[i]>A[len-1])
{
A[len++]=S[i];
}
else
{
A[lower_bound(A,A+len-1,S[i])-A]=S[i];
}
}
cout<<len<<endl;
return 0;
}