题目大意
给定一个长度为n的整数序列,求个最长子序列(不一定连续),使得该序列的长度为奇数2k+1,前k+1个数严格递增,后k+1个数严格递减。注意,严格递增意味着该序列中的两个相邻数不能相同。n<=10000
题解
这个题目和POJ1836有点相似,都是从左往右搞一遍LIS,然后从右到左也搞一遍LIS,然后枚举中间点,然后选取两者的较小者*2-1就是答案了
代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; #define MAXN 10005 int a[MAXN],c[MAXN],d[MAXN]; int n; void LIS(int *a,int *dp) { int g[MAXN],cnt=0; g[0]=a[0],dp[0]=1; for(int i=1;i<n;i++) if(a[i]>g[cnt]) g[++cnt]=a[i],dp[i]=cnt+1; else { int pos=lower_bound(g,g+cnt,a[i])-g; g[pos]=a[i]; dp[i]=pos+1; } } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); LIS(a,c); reverse(a,a+n); LIS(a,d); int ans=0; for(int i=0;i<n;i++) ans=max(ans,2*min(c[i],d[n-i-1])-1); printf("%d ",ans); } return 0; }