zoj2136最长上升子序列

zoj2136最长上升子序列
最长上升子序列,算法不多讲了,这里说一下代码里的二分查找函数(bS())
二分查找以前也写过,是在有序表中找出元素key的位置,这里的bS()函数略有不同,它是在递增序列中找出第一个大于key的元素的位置。为了方便处理边界,我在有序序列的起点加入了一个最小值,在有序序列的终点加了一个最大值。
具体请看代码:

#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define LEN 1010
#define MAX 1000000
int num[LEN];
int L[LEN];
int len;
int p;
int bS(int bg, int ed, int n)
{
    
int mid;
    
while(bg <= ed)
    
{
        mid 
= (bg + ed) / 2;
        
if(n > L[mid] && n < L[mid + 1])
            
return mid + 1;
        
else if(n > L[mid])
            bg 
= mid + 1;
        
else
            ed 
= mid - 1;
    }

}

int main()
{
    
int i, j;
    
int N;
    scanf(
"%d"&N);
    
for(int ii = 0; ii < N; ii++)
    
{
        scanf(
"%d"&p);
        
for(i = 0; i < p; i++)
            scanf(
"%d"&num[i]);
        L[
0= -MAX;
        L[
1= num[0];
        len 
= 2;
        
for(i = 1; i < p; i++)
        
{
            L[len] 
= MAX;
            
int mid = bS(1, len - 1, num[i]);
            
if(mid >= len)
            
{
                L[len
++= num[i];
            }

            
else
                L[mid] 
= num[i];
        }

        
if(ii != 0)
            printf(
"\n");
        printf(
"%d\n", len - 1);
    }

    
//system("pause");
}


你可能感兴趣的:(zoj2136最长上升子序列)