本题就是要求最大递增序列,用二分查找的方法,很容易解决。。
#include"stdio.h"
int a[40006],b[40006];
int find(int sum,int low,int high)
{
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(sum>=b[mid])
low=mid+1;
else
high=mid-1;
}
return low;
}
int fun(int m)
{
int len=1,i,h;
b[1]=a[1];
for(i=2;i<=m;i++)
{
if(a[i]>b[len])
{
len++;
b[len]=a[i];
}
else
{
h=find(a[i],1,len);
b[h]=a[i];
}
}
return len ;
}
int main()
{
int m,n,i,j,k,h;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
a[i]=k;
}
printf("%d\n",fun(n));
}
return 0;
}