POJ2533/hdoj1950【DP】

O(nlog(n))的方法;
定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素。
d中元素也是单调递增的。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const double pi = acos(-1.0);
const int mod = 1e9+7;

const int N =1e5+10;
int a[N];
int d[N];

int kill(int len,int x)
{
    int be,ed;
    be=1,ed=len;
    while(be<=ed)
    {
        int mid=(be+ed)/2;
        if(x>d[mid])
            be=mid+1;
        else
            ed=mid-1;
    }
    return be;
}

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);

    int len=1,j;
    d[1]=a[1];
    for(int i=2;i<=n;i++)
    {
        if(d[1]>=a[i])//比最小还小
            j=1;
        else if(a[i]>d[len]) //比最大还大
            j=++len;
        else
            j=kill(len,a[i]); 
        d[j]=a[i];
    }
    printf("%d",len);
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934480.html