hdu4745 Two Rabbits(dp求回文串!比赛时愣是想不到!肿么破。。。)

题目大意:n个石头围成一圈,每个有权值,现在两只兔子从任意两个石头开始,一个顺时针,一个逆时针跳,可以跳任意远,但是不能超过一圈,要两只兔子所在的石头对应的权值任意时刻都相同,问兔子最多跳多少步。

//#pragma comment(linker, "/STACK:16777216")
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<vector>
#define tree int o,int l,int r
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define lo o<<1
#define ro o<<1|1
#define ULL unsigned long long
#define LL long long
#define inf 0x7fffffff
#define eps 1e-7
#define N 2005
using namespace std;
int m,n,T,t,x,y,u;
int a[N];
int d[N][N];
int main()
{
#ifndef ONLINE_JUDGE
    freopen("ex.in","r",stdin);
#endif
//    scanf("%d",&T);
//    while(T--)
    int ncase=0;
    while(scanf("%d%*c",&n)==1&&n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a[i+n]=a[i];
        }
        for(int i=1;i<=n*2;i++)
        d[i][i]=1;
        for(int i=2;i<=n*2;i++)
        d[i-1][i]=(a[i]==a[i-1]?2:1);
        for(int k=2;k<n;k++)
        {
            for(int i=1,j;i+k<=n*2;i++)
            {
                j=i+k;
                if(a[i]==a[j])
                d[i][j]=2+d[i+1][j-1];
                else
                d[i][j]=max(d[i+1][j],d[i][j-1]);
            }
        }
        int ans=d[1][n];
        for(int i=1;i+n-1<=n*2;i++)
        {
            int j=i+n-1;
            for(int k=i;k<j;k++)
            {
                ans=max(ans,d[i][k]+d[k+1][j]);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2013-09-19 10:43  baoff  阅读(225)  评论(0编辑  收藏  举报