zoukankan      html  css  js  c++  java
  • 回文串---吉哥系列故事——完美队形II

    HDU  4513

    Problem Description
      吉哥又想出了一个新的完美队形游戏!
      假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形:

      1、挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的;
      2、左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意;
      3、从左到中间那个人,身高需保证不下降,如果用H表示新队形的高度,则H[1] <= H[2] <= H[3] .... <= H[mid]。

      现在吉哥想知道:最多能选出多少人组成新的完美队形呢?
    Input
      输入数据第一行包含一个整数T,表示总共有T组测试数据(T <= 20);
      每组数据首先是一个整数n(1 <= n <= 100000),表示原先队形的人数,接下来一行输入n个整数,表示原队形从左到右站的人的身高(50 <= h <= 250,不排除特别矮小和高大的)。
    Output
      请输出能组成完美队形的最多人数,每组输出占一行。
    Sample Input
    2 3 51 52 51 4 51 52 52 51
    Sample Output
    3 4
    Source
    Recommend
    liuyiding   |   We have carefully selected several similar problems for you:  5669 5668 5667 5666 5665 
     
    题意:求最长的回文数列,且回文数列满足H[1] <= H[2] <= H[3] .... <= H[mid];
     
    思路:用int数组仿照字符数组,在每个数字之间插入0将数组长变为奇数,注意将边界设为一个大于250的值;
     
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N=100010;
    int n,p[N];
    int s[2*N],str[2*N];
    
    void kp()
    {
        int mx=0;
        int id;
        for(int i=1; i<n; i++)
        {
            if(mx>i)
                p[i]=min(p[2*id-i],p[id]+id-i);
            else
                p[i]=1;
            for(; i+p[i]<n;)
            {
                ///cout<<6<<endl;
                if(str[i+p[i]]==str[i-p[i]])
                {
                    if(str[i+p[i]]==0) p[i]++;
                    else if(str[i+p[i]]<=str[i+p[i]-2])
                    {
                        p[i]+=2;
                    }
                    else break;
                }
                else break;
            }
            ///for( ;str[i+p[i]]==str[i-p[i]];p[i]++);
            if(p[i]+i>mx)
            {
                mx=p[i]+i;
                id=i;
            }
        }
    }
    
    void init()
    {
        str[0]=0;
        str[1]=0;
        for(int i=0; i<n; i++)
        {
            str[i*2+2]=s[i];
            str[i*2+3]=0;
        }
        n=n*2+2;
        ///s[n]=0;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(int i=0; i<n; i++)
                scanf("%d",&s[i]);
            init();
            kp();
            int ans=0;
            for(int i=1; i<n; i++)
                if(p[i]>ans)
                    ans=p[i];
            printf("%d
    ",ans-1);
        }
        return 0;
    }
  • 相关阅读:
    leetcode33. Search in Rotated Sorted Array
    pycharm 设置sublime text3 monokai主题
    django class Meta
    leetcode30, Substring With Concatenation Of All Words
    Sublime text3修改tab键为缩进为四个空格,
    sublime text3 python打开图像的问题
    安装上imesupport输入法依然不跟随的解决办法,
    sublime text3 的插件冲突弃用问题,
    sublime text3 BracketHighlighter括号匹配的设置
    windows 下wget的使用
  • 原文地址:https://www.cnblogs.com/chen9510/p/5401442.html
Copyright © 2011-2022 走看看