题目:http://poj.org/problem?id=1631
求LIS即可,我使用了树状数组。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,p,a[40005],f[40005];
int query(int x)
{
int ret=0;
for(;x;x-=x&-x)
ret=max(ret,f[x]);
return ret;
}
void update(int x,int k)
{
for(;x<=p;x+=x&-x)
f[x]=max(f[x],k);
}
int main()
{
scanf("%d",&n);
while(n--)
{
scanf("%d",&p);
memset(f,0,sizeof f);
for(int i=1;i<=p;i++)
{
scanf("%d",&a[i]);
int k=query(a[i]);
update(a[i],k+1);
}
printf("%d\n",query(p));
}
return 0;
}