Lis 最长递增子序列

时间复杂度:n*log n

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 50005;
int dp[maxn] , a[maxn];
int Lis(int n) {
    int len = 1 , left , right , mid;
    dp[1] = a[1];
    for(int i=2;i<=n;i++) {
        left = 1;
        right = len;
        while(left <= right) {
            mid = (left + right) / 2;
            if(a[i] > dp[mid])
                left = mid + 1;
            else right = mid - 1;
        }
        dp[left] = a[i];
        if(left > len) len = left;
    }
    return len;
}
int main() {
    int n , cas = 1;
    while(~scanf("%d",&n)) {
        for(int i=1;i<=n;i++) scanf("%d",a+i);
        int ans = Lis(n);
        printf("%d\n",ans);
    }
    return 0;
}
posted @ 2012-07-11 13:14  lenohoo  阅读(148)  评论(0编辑  收藏  举报