首页 > 代码库 > nyoj 214 单调递增子序列(二) 【另类dp】
nyoj 214 单调递增子序列(二) 【另类dp】
单调递增子序列(二)
时间限制: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
分析:跟hdoj1025原理http://blog.csdn.net/shengweisong/article/details/40347947一样
代码:
#include <stdio.h> #include <string.h> #include <algorithm> #define M 100005 using namespace std; int a[M], d[M]; int bis(int m, int len){ int left = 1, right = len, mid; while(left <= right){ mid = (right+left)>>1; if(d[mid] > m) right = mid-1; else if(d[mid]< m) left = mid+1; else return mid; } return left; } int main(){ int n; while(~scanf("%d", &n) ){ memset(d, 0, sizeof(d)); int i, len; for(i = 0; i < n; i ++){ scanf("%d", &a[i]); } //sort(a, a+n); len = 1; d[len] = a[i]; for(i = 1; i < n; i ++){ int t = bis(a[i], len); d[t] = a[i]; if(t>len) len++; } printf("%d\n", len); } return 0; }
nyoj 214 单调递增子序列(二) 【另类dp】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。