andre_joy

导航

poj 3903

地址:http://poj.org/problem?id=3903

题意:求最长上升子序列。

mark:在网上学习一种O(nlgn)的算法,拿过来试验了一下。http://blog.sina.com.cn/s/blog_76344aef0100scyq.html

代码:

#include <stdio.h>

int len;
int a[100010];
int d[100010];

int find(int m)
{
    int fr = 0, la = len-1, mid;
    while(fr <= la)
    {
        mid = (fr+la)/2;
        if(d[mid] == m) return 0;
        if(d[mid] > m) la = mid-1;
        else fr = mid+1;
    }
    return fr;
}

int main()
{
    int n,m;
    int i;
    while(~scanf("%d", &n))
    {
        len = 0;
        for(i = 0; i < n; i++)
        {
            scanf("%d", a+i);
            if(!len) {d[len++] = a[i]; continue;}
            if(a[i] < d[0]) {d[0] = a[i]; continue;}
            if(a[i] > d[len-1]) {d[len++] = a[i]; continue;}
            m = find(a[i]);
            if(m) d[m] = a[i];
        }
        printf("%d\n", len);
    }
    return 0;
}

posted on 2012-07-25 15:30  andre_joy  阅读(234)  评论(0编辑  收藏  举报