HDU4745

题目大意

给出一个长度为n的环状序列,两只兔子各自从一个点出发,一个顺时针跳,一个逆时针跳,每个时刻都要求两只兔子所在的数字是相同的,兔子最多跳一个圈~~~问兔子们最多能跳多少次

题解

一个逆时针跳,一个顺时针跳,经过的数字刚好组成了一个回文串,所以题目的要求就是求最长的回文,不过序列是环状的!怎么办?我们看看样例:2 1 1 2 1 3 答案是5

2 1 1 2 1 3,其实就是[1,4]区间的最长回文加上[5,6]区间的最长回文,因此我们枚举中间点i,求出max(dp[1,i]+dp[i+1,n])就是最终结果~~~~ 当时听学长说是没固定端点的LCS。。。就没去理了,早知道要是自己看题了,估计可以A掉,因为做过相类似的题目。。。

代码交上去还拿了个rank1~~

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define MAXN 1005
short dp[MAXN][MAXN];
short a[MAXN];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        for(int i=0;i<n;i++) dp[i][i]=1;
        for(int i=n-1;i>=0;i--)
            for(int j=i+1;j<n;j++)
                if(a[i]==a[j])
                    dp[i][j]=dp[i+1][j-1]+2;
                else
                    dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
        int ans=dp[0][n-1];
        for(int i=0;i<n-1;i++) ans=max(ans,dp[0][i]+dp[i+1][n-1]);
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zjbztianya/p/3326296.html