您的位置:首页 > 其它

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

2015-08-28 11:25 134 查看


单调递增子序列(二)

时间限制: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


求单调子序列的长度,用二分的方法比较好,一般都不会超时,stl 里面提供了二分的函数,灵活使用的话,很简洁,很方便,有兴趣的可以自己构造个二分查找函数.........

也是第一次这样做 lis 的题目,思想都一样,只是具体处理的细节有点区别....

两个二分查找函数介绍(x 数组需要查找的部分是有序的):

lower_bound(x+n,x+m,s)  的用法是:在 数组 x
到x[m-1] 中的元素中找到一个大于等于 s 的下标最小的元素,返回地址.....

upper_bound(x+n,x+m,s)  的用法是:在 数组 x
到x[m-1] 中的元素中找到一个大于(注意没有等于) s 的下标最小的元素,返回地址.....

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 0x3f3f3f3f
int x[1000005];
int main()
{
int n,a;
while(~scanf("%d",&n))
{
memset(x,maxn,sizeof(x));
for(int i=0;i<n;++i)
{
scanf("%d",&a);
x[lower_bound(x,x+n,a)-x]=a;//更新位置
}
printf("%d\n",lower_bound(x,x+n,maxn)-x);//输出长度!
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: