#include <iostream>
#include <algorithm>
using namespace std;
const int M=41000;
const int inf=1<<30;
int n,a[M],dp[M]; // dp[i] 以i结尾的 LIS长度
//no two signals cross.
// 等价于 i<j a[i]<a[j] 才不会Cross
// finds the maximum number of signals which may be connected on the silicon surface without crossing each other
// 即求序列中的LIS
int g[M]; // g[i] LIS长度为i 的最小结尾 x
int fun(int x)
{
int f=1,l=n,mid,pos;
while(f<l)
{
mid=(f+l)/2;
if(g[mid]<x)
{
f=mid+1;
pos=f;
}
else
{
l=mid;
pos=l;
}
}
return pos;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
g[i]=inf; //
}
int ans=1;
cin>>a[1];
g[1]=a[1];
for(int i=2;i<=n;i++)
{
cin>>a[i];
int k=fun(a[i]); // 找到第一个大于a[i] g[k] : 所以以a[i]结尾的LIS长度为 k-1+1 (a[i]添加在以g[k-1]的LIS之后)
ans=max(ans,k);
g[k]=a[i]; //更新
}
cout<<ans<<endl;
}
return 0;
}
poj 1631 LIS nlogn
最新推荐文章于 2018-02-28 21:09:00 发布