题目大意: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 ",ans); } return 0; }