poj 3903 Stock Exchange(最长上升子序列,模版题)

题目

 

#include<stdio.h>
//最长上升子序列 nlogn
//入口参数:数组名+数组长度,类型不限,结构体类型可以通过重载运算符实现
//数组下标从1号开始。

int bsearch(int a[],int len,int num)
{
    int left=1,right=len;
    while(left<=right)
    {
        int mid=(left+right)/2;
        if(num<=a[mid])  //若最长不下降子序列,改<= 为 <
            right=mid-1;
        else
            left=mid+1;
    }
    return left;
}

int LIS(int a[],int len)
{
    int i,j,count=1;
    int *dp=new int[len+1];
    dp[1]=a[1];
    for(i=2;i<=len;i++)
    {
        if(a[i]>dp[count])    //若最长不下降子序列,改> 为 >=
            dp[++count]=a[i];
        else if(a[i]<=dp[1])    //若最长不下降子序列,改<= 为 <
            dp[1]=a[i];
        else
dp[bsearch(dp,count,a[i])]=a[i];            
    }
    return count;
}
int aa[100099];
int main()
{
    int t,i;
    while(~scanf("%d",&t))
    {
        for(i=1;i<=t;i++)
            scanf("%d",&aa[i]);
        printf("%d\n",LIS(aa,t));
    }
    return 0;
}
View Code

 

posted @ 2014-06-25 21:23  laiba2004  Views(138)  Comments(0Edit  收藏  举报