A序列

发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:05   时间限制: 1000ms   内存限制: 128M

描述

如果一个序列有奇数个正整数组成,不妨令此序列为a 1 ,a 2 ,a 3 ,...,a 2∗k+1   (0<=k  ),并且a 1 ,a 2 ...a k+1   是一个严格递增的序列,a k+1 ,a k+2 ,...,a 2∗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

思路:我们遍历序列中每一个数字看看,对于每一个数字ai,以ai为中心,能得到的最长A序列是多少,这时先得到ai左边序列(以ai为序列末尾)的最长上升子序列left[i],再得到ai右边序列(包括ai)的最长下降子序列,最长下降子序列相当于序列倒着排的最长上升子序列,求得为right[i];
按A序列定义,ai的左右两边数字个数应该相等,那要使得ai为中心的A序列尽量大,可以去min(left[i],right[i])为A序列的长度的一半,2*min(left[i],right[i])-1即是以ai为中心A序列的最大长度,遍历ai,求最大长度。

AC代码:

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<stack>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int N_MAX = +;
vector<int>vec;
int dp[N_MAX];
int Right[N_MAX], Left[N_MAX];
int n;
void LIS(const vector<int>&vec,int *a) {
fill(dp,dp+n,INF);
for (int i = ; i < n;i++) {
*lower_bound(dp,dp+n,vec[i])=vec[i];
a[i] = lower_bound(dp, dp + n, INF) - dp;
}
}
int main() { while (scanf("%d",&n)!=EOF) {
vec.clear();
vec.resize(n);
for (int i = ; i < n;i++)
scanf("%d",&vec[i]);
int ans=;
LIS(vec,Left);
reverse(vec.begin(), vec.end());
LIS(vec, Right);
int res=;
for (int i = ; i < n;i++) {
int ans = min(Right[i], Left[n-i]);
res = max(res, ans);
}
printf("%d\n",*res-);
}
return ;
}

最新文章

  1. [LintCode] Longest Increasing Subsequence 最长递增子序列
  2. SQL 常用操作
  3. linux免交互登陆远程主机并执行命令(密钥对和Expect)
  4. 为 Docker Registry 增加 Nginx 前端
  5. json format validator
  6. 弹性布局-flex
  7. Xubuntu下Mentohust认证(校园网用户)
  8. sharepoint 2013 suitbar
  9. Qt Creator编译时:cannot open file &#39;debug\QtGuiEx.exe&#39; File not found
  10. linkin大话java
  11. 见过的最全的iOS面试题
  12. C++自己实现一个String类
  13. Python之words count
  14. 开关Windows休眠功能
  15. 基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)
  16. Windows虚拟内存不足问题的处理
  17. Docker Swarm——集群管理
  18. A8逻辑篇1.点亮一个LED(S5PV210.A8)
  19. react onclick传递参数
  20. sql where 1=1和 0=1 的作用(多条件查询错误的问题)

热门文章

  1. javascript基本类型和引用类型,作用域和内存问题
  2. java里面byte数组和String字符串怎么转换
  3. LVM逻辑分区的优缺点与步骤
  4. gson对象的相互转换
  5. SNP|RELP|genetic polymorphism|
  6. Bootstrap 基本按钮
  7. EXTJS中文乱码
  8. Git学习——查看修改记录
  9. 继上次编译openwrt之后,添加web界面
  10. laravel中的gate