题目大意
给出一个长度为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; }