读了好几遍题,也没想到是求最长上升子序列。。。看了别人的分析后才明白。。。。要想让桥不相交,就必须是上升序列。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int b_search(int a[],int x,int len) //此处用二分查找以降低时间复杂度。。。否则会超时。。。
{
int low=1,high=len,mid;
while(low<=high){
mid=(low+high)/2;
if(x>a[mid]&&x<a[mid+1])
return mid+1;
else if(x>a[mid]) low=mid+1;
else high=mid-1;
}
return mid; //说明x比a中最小元素还要小
}
int main()
{
int t,n;
int i,j,k,len,p[40005],f[40005];
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
len=1; f[1]=p[1];
for(i=2;i<=n;i++){
if(p[i]>f[len]){
len++;
f[len]=p[i];
}else if(p[i]<f[len]){
k=b_search(f,p[i],len);
f[k]=p[i];
}
}
printf("%d\n",len);
}
return 0;
}