zoukankan      html  css  js  c++  java
  • HDU4745--区间DP+回文串

      这题的题意为,给你一个环状的字符串,有两只兔子分别从某任意的石头上开始跳跃。一只顺时针跳、一只逆时针跳。两只兔子每一次落脚处石头的质量都相同。兔子要一步一步的跳,且不能跳到之前跳到过的地方。总的来说,就是一只兔子最多就只能跳一整圈。每一次两只兔子落点的权值都相同,问兔子最多可以跳几次。这一题可以简化,用区间DP来求所有区间内的最长回文串长度。之后一遍for循环遍历,把区间[0,n-1]划分成[0,k]和[k+1,n-1]。找到这两个区间回文串长度和的最大值,即为答案。证明如下:

    我们把区间分成了两部分   我们假设是串A和串B   我们可以把串A分成镜面对称的字符串a和字符串a,同理分解B。相当于拆成了43个串,但a和a连续  b和b连续。两个兔子设为从同一点出发。概念如图所示。

    因此,求得A和B的最大回文长度之和,即求到了结果。代码如下:

    #include<iostream>
    #include<string.h>
    using namespace std;
    int T,i,j,k,l,n,m;
    int a[1050][1050];
    int c[1050];
    int main()
    {
        
        while(cin>>n&&n!=0)
        {
            memset(a,0,sizeof(a));
            for(i=0;i<n;i++) cin>>c[i];
            for(i=0;i<n;i++) a[i][i]=1;
            for(i=n-2;i>=0;i--)
            for(j=i+1;j<n;j++)
            {
                if(c[i]==c[j]) a[i][j]=a[i+1][j-1]+2;
                else a[i][j]=max(a[i+1][j],a[i][j-1]);
            }
            int ans=1;
            for(i=0;i<n-1;i++) ans=max(ans,a[0][i]+a[i+1][n-1]);
            cout<<ans<<endl;
            
        }
    }
  • 相关阅读:
    Hibernate配置
    Log4j 局部笔记
    有关接口 笔记 懒人版
    JAVA面向对象编程这本书的摘录~!(2016-5-23)
    关于关闭数据流
    安卓桌面开发小应用
    ACM Sdut 2158 Hello World!(数学题,排序) (山东省ACM第一届省赛C题)
    hdu 1573 A/B (扩展欧几里得)
    hdu 1788 Chinese remainder theorem again(最小公倍数)
    ACM hdu 1019 Least Common Multiple
  • 原文地址:https://www.cnblogs.com/wsblm/p/10673035.html
Copyright © 2011-2022 走看看