UVa10534

题目大意

给定一个长度为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;
}
原文地址:https://www.cnblogs.com/zjbztianya/p/3270954.html