HDU - 4745 Two Rabbits

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

思路:求最长的回文串,然后枚举dp[0,i]+dp[i+1,n-1]就是最大值了,试想一只兔子从[0,i]中对称的一点开始,另一只兔子从[i+1,n-1]的对称点开始跳,注意求的是两只兔子一共跳了多少

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1005;

int dp[MAXN][MAXN],a[MAXN];
int n;

int main(){
    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 = 1;
        for (int i = 0; i < n; i++)
            ans = max(ans,dp[0][i]+dp[i+1][n-1]);
        printf("%d\n",ans);
    }    
    return 0;
}



你可能感兴趣的:(HDU - 4745 Two Rabbits)