首页 > 学院 > 开发设计 > 正文

nyoj214——单调递增子序列(二)

2019-11-06 06:57:25
字体:
来源:转载
供稿:网友
描述

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

解决方法:复杂度为O(nlogn)的求最长递增子序列

#include <iostream>#include <cstdio>#include <cstring>#include <climits>#define maxn 100005using namespace std;int dp[maxn],a[maxn];int Search(int x,int len){    int left=1,right=len,mid=(left+right)>>1;    while(left<=right)    {        if(x>dp[mid])        {            left=mid+1;        }        else        {            if(x==dp[mid])                return mid;            else            {                right=mid-1;            }        }        mid=(left+right)>>1;    }    return left;}int main(){    int n;    while(~scanf("%d",&n))    {        for(int j=0;j<n;j++)            scanf("%d",&a[j]);        int cnt=1;        dp[0]=-INT_MAX;        dp[1]=a[0];        for(int j=1;j<n;j++)        {            int pos=Search(a[j],cnt);//            dp[pos]=a[j];            if(pos>cnt)                cnt=pos;        }        PRintf("%d/n",cnt);    }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表