HDU4745 - Two Rabbits(区间DP)

题目大意

给出一个长度为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\n",ans);

    }

    return 0;

}

你可能感兴趣的:(HDU)