NYOJ 214 单调递增子序列(二) (LIS模板)

来源:互联网 发布:破解摄像头app软件 编辑:程序博客网 时间:2024/05/22 06:29

单调递增子序列(二)

时间限制: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型整数)!
输出
对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
样例输入
71 9 10 5 11 2 1322 -1
样例输出
51


累了刷水题:熟练掌握,要知道变通,根据不同要求写出不同的代码,形式等,分析复杂度·,考虑用数据结构优化;


AC代码:

#include<cstdio>#include<algorithm>using  namespace std;int a[100010],dp[111111];int LIS(int N){int i=0,cnt=2;dp[1]=a[1]; for(i=2;i<=N;++i){int pos=lower_bound(dp+1,dp+cnt,a[i])-dp;        if(pos==cnt) ++cnt;        dp[pos]=a[i];    }    return cnt-1;}int main(){int N,i;while(~scanf("%d",&N)){for(i=1;i<=N;++i) scanf("%d",&a[i]);printf("%d\n",LIS(N)); }return 0; }

0 0
原创粉丝点击