标签:
http://acm.hdu.edu.cn/showproblem.php?pid=4745
1 1 4 1 1 2 1 6 2 1 1 2 1 3 0
1 4 5HintFor the second case, the path of the Tom is 1, 2, 3, 4, and the path of Jerry is 1, 4, 3, 2. For the third case, the path of Tom is 1,2,3,4,5 and the path of Jerry is 4,3,2,1,5.
/**
hdu 4745 最长回文子序列 (区间DP)
题目大意:在一个长度为n的环形序列上的任取两个点,一个向左走一个向右走,求他们走了多少步后二人可以再同一个点相遇(题目数据保证他们会在一个点相遇)
解题思路:看了题解我才明白,其实就是求这个环形序列的最长回文子序列,然后考虑两个起点的值相同时的情况就好了
1、起点相同 maxx=max(maxx,dp[i][i+n-1]);
2、地点不同 maxx=max(maxx,dp[i][i+n-2]+1);
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
using namespace std;
int dp[2005][2005],a[2005],n;
int main()
{
while(~scanf("%d",&n))
{
if(n==0) break;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];
}
n*=2;
memset(dp,0,sizeof(dp));
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++)
{
dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
if(a[i]==a[j])
{
dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2);
}
}
}
/**
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d ",dp[i][j]);
}
printf("\n");
}*/
int maxx=-1;
n/=2;
for(int i=1;i<=n;i++)
{
maxx=max(maxx,dp[i][i+n-1]);
}
///如果二者各自起始点石头重量相同
for(int i=1;i<=n;i++)
{
maxx=max(maxx,dp[i][i+n-2]+1);
}
printf("%d\n",maxx);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/45059519