POJ 3903 Stock Exchange_LIS(最长递增子序列) 经典例题!

刚开始想暴力求解,发现会超时,然后用二分法可以优化,这是一道裸的LIS!

#include <iostream>
#include <cstring>
using namespace std;
int dp[100010];
int Binary_Searching(int x,int len)
{
    int mid,l=1,r=len;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(x>dp[mid])
            l=mid+1;
        else
            r=mid-1;
    }
    return l;
}
int main()
{
    int t,a[100010],i,j,len;
    while(cin>>t)
    {
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        len=1;
        for(i=1; i<=t; i++)
            cin>>a[i];
        dp[len]=a[1];
        for(i=2; i<=t; i++)
        {
            if(a[i]>dp[len])
            {
                dp[++len]=a[i];
            }

            if(a[i]<dp[len])
                dp[Binary_Searching(a[i],len)]=a[i];
        }
        cout<<len<<endl;
    }
    return 0;
}


你可能感兴趣的:(dp,poj)