单调递增子序列二

来源:互联网 发布:网络推广好做吗 编辑:程序博客网 时间:2024/04/28 04:45


给定一整型数列{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型整数)!

输出

对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。

样例输入

71 9 10 5 11 2 1322 -1

样例输出

51
#include <iostream>#include <cstdio>const int N = 100000 + 10;using namespace std;int a[N], dp[N];int f(int k, int len){    int right = len;    int left = 1;    int mid = (right + left) >> 1;    while(left <= right)    {        if(k == dp[mid])            return mid;        if(k > dp[mid])            left = mid + 1;        else            right = mid - 1;        mid = (right + left) >> 1;    }    return left;}int main(){    int n;    while(~scanf("%d", &n))    {        int len, t;        for(int i = 0; i < n; ++i)            scanf("%d", &a[i]);        len = 1;        dp[1] = a[0];        for(int i = 1; i < n; ++i)        {            t = f(a[i], len);            dp[t] = a[i];            if(t > len)                len = t;        }        printf("%d\n", len);    }    return 0;}

0 0
原创粉丝点击