A序列(最长上升子序列)
2017-08-15 15:20
183 查看
A序列
发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:05 时间限制: 1000ms 内存限制: 128M描述
如果一个序列有奇数个正整数组成,不妨令此序列为a1,a2,a3,...,a2∗k+1(0<=k),并且a1,a2...ak+1是一个严格递增的序列,ak+1,ak+2,...,a2∗k+1,是一个严格递减的序列,则称此序列是A序列。
比如1 2 5 4 3就是一个A序列。
现在Jazz有一个长度为n的数组,他希望让你求出这个数组所有满足A序列定义的子序列里面最大的那个长度。(子序列可以不连续)
比如1 2 5 4 3 6 7 8 9,最长的A序列子串是1 2 5 4 3。
输入
多组输入,每组两行。
第一行是n,表示给的数组的长度。
第二行有n个数(int范围),即给你的数组。
1<=n<=500000。
输出
每组输入输出一行,即最长的A序列子串的长度。
样例输入1
9 1 2 5 4 3 6 7 8 9
样例输出1
5
#include<stdio.h> #include<map> #include<string.h> using namespace std; int a[500010]; int a1[500010]; int b1[500010]; int g[500010]; int main() { int n; while(scanf("%d",&n)!=EOF) { memset(a1,0,sizeof(a1)); memset(b1,0,sizeof(b1)); memset(g,0,sizeof(g)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } g[1]=a[1]; int len=1; a1[1]=1; for(int i=1;i<n;i++) { if(a[i]>g[len]) { len++; g[len]=a[i]; a1[i]=len; } else { int pos=lower_bound(g+1,g+len+1,a[i])-g; g[pos]=a[i]; a1[i]=pos; } } memset(g,0,sizeof(g)); g[1]=a ; len=1; b1[1]=1; for(int i=n-1;i>=1;i--) { if(a[i]>g[len]) { len++; g[len]=a[i]; b1[i]=len; } else { int pos=lower_bound(g+1,g+len+1,a[i])-g; g[pos]=a[i]; b1[i]=pos; } } int max_=0; for(int i=1;i<=n;i++) { int temp=min(a1[i],b1[i]); if(temp>max_) { max_=temp; } } printf("%d\n",max_*2-1); } }
相关文章推荐
- POJ 1836 Alignment(DP max(最长上升子序列 + 最长下降子序列))
- Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp
- shuoj1936-D序列—最长上升子序列
- HDU 5256 序列变换(最长上升子序列)
- HDU-1257 最少拦截系统 贪心/DP 最长上升子序列的长度==最长不上升子序列的个数?
- LIS 最长上升子序列问题 nlgn时间打印其中一个序列
- 蓝桥杯算法训练拦截导弹【最长上升子序列 & 最长非下降子序列nlogn 和 n^2】
- 动态规划之最大公共序列+最长上升子序列
- POJ 1836 Alignment(DP max(最长上升子序列 + 最长下降子序列))
- 小明系列问题——小明序列 (线段树优化的最长上升子序列)
- 最长上升子序列(LIS)和最长下降子序列(LDS)
- 波浪子序列 Wavio Sequence UVA10534 动态规划 最长上升子序列变形
- HDU-4521 小明系列问题——小明序列 间隔限制最长上升子序列
- shuoj1936-D序列—最长上升子序列
- hdu 5256 序列变换(LIS最长上升子序列)
- HDU 5256 序列变换(最长上升子序列)
- SHU OJ - 415 A序列 最长上升子序列
- 波浪子序列 Wavio Sequence UVA10534 动态规划 最长上升子序列变形
- Longest Ordered Subsequence与最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)
- LuoguP2757 导弹的召唤 解题报告【最长上升子序列+最长不上升子序列】