zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    自己收集的一些伪元素/伪类
    ie9的placeholder不显示的解决办法(包含多个密码框)
    9.14上午
    9.13
    9.11笔记
    html基础英语单词
    选择器的分辨
    学习笔记
    RecyleView
    自定义view获取宽高
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3270954.html
Copyright © 2011-2022 走看看