ZOJ 1986 Bridging Signals 最长子序列

ZOJ 1986 Bridging Signals 最长子序列

经过看抄别人的算法过了,原来这种题有两种,一种是O(n^2)的,一种是(n*logN)的

#include <stdio.h>
#include <alloc.h>
int main()
{
 int N,n,i,j,t,Len;
 int *L ,*B;
 scanf("%d",&N);
 while(N--)
 {
  scanf("%d",&n);
  L = (int *)malloc(sizeof(int)*n);
  B = (int *)malloc(sizeof(int)*n);
  i = 0;
  t = n;
  while(t--)
  {
   scanf("%d",&L[i]);
   i++;
  }
  B[0]=-10000;
  B[1]=L[0];
  Len = 1;
  int p,r,m;
  for(i=1;i<n;i++)
  {
   p=0;r=Len;
   while(p<=r)
   {
    m = (p+r)/2;
    if(B[m]<L[i]) p = m+1;
    else r = m-1;
   }
   B[p] = L[i];
   if(p>Len) Len++;
  }
  free(L);
  free(B);
  printf("%d\n",Len);
 }
 return 0;
}

posted on 2006-08-20 11:48  AnewR  阅读(477)  评论(0编辑  收藏  举报