您的位置:首页 > 其它

nyoj 214 单调递增子序列(二) 【LIS】

2015-07-30 20:06 260 查看

单调递增子序列(二)

时间限制:1000 ms | 内存限制:65535 KB

难度:4

描述
给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

输入 有多组测试数据(<=7)

每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。

数据以EOF结束 。

输入数据保证合法(全为int型整数)! 输出 对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。 样例输入
7
1 9 10 5 11 2 13
2
2 -1

样例输出
5
1


留很长时间了,今天A了。 算法具体实现看我上一篇。


#include <cstdio>
#include <cstring>
#define INF 400000000
#define MAXN 100000+10
int a[MAXN];
int s[MAXN];
int binary_search(int *s, int now, int length)
{
    int left = 0, right = length, mid;
    while(right >= left)
    {
        mid = (left + right) >> 1;
        if(s[mid] >= now)
            right = mid - 1;
        else
            left = mid + 1;
    }
    return left;
}
int main()
{
    int N;
    int len;
    while(scanf("%d", &N) != EOF)
    {
        for(int i = 1; i <= N; i++)
            scanf("%d", &a[i]);
        s[0] = -INF;//注意这里的初始化
        len = 1;
        for(int i = 1; i <= N; i++)
        {
            s[len] = INF;
            int j = binary_search(s, a[i], len);
            if(j == len)
                len++;
            s[j] = a[i];
        }
        printf("%d\n", len - 1);
    }
    return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: