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; }
相关文章推荐
- 字符串反转(java实现)
- WMS8_基本操作
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——JAVA实现
- 读书笔记MoreEffectiveC++(34)
- 杭电1950 Bridging signals(求一个数列的最大递增子数列)
- SpringBoot 资料收集
- 检错码之海明码
- 云计算和大数据时代网络技术揭秘(十八)刀片服务器的网络
- 微型企业如何使用odoo
- BGP的13条选路原则
- [BZOJ1047][HAOI2007]理想的正方形
- UNIX 系统家族树的详细历史(图)
- mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi 对应的像素密度
- 记录Uniyt3d Shader的几个用法
- poj 1064 Cable master【二分】
- sgu 463 - Walking around Berhattan
- BAPI_NETWORK_COMP_REMOVE
- REST和RESTFUL的相关概念理解
- HDU-1285-确定比赛名次-拓扑排序(模板)
- hdu 5319 Painter(模拟题)