这道题相对来说,我觉得就有点考查读题了
读题时一定要细心,大致就是要你求一个回文子序列,递推方程很简单
if(a[i]==a[j])
g[i][j]=max(g[i][j],g[i+1][j-1]+2);
else
g[i][j]=max(g[i+1][j],g[i][j-1]);
但不过他是环形的,但不过他又说了两只兔子可以同时站在一个石头上。
所以遍历答案是就有同时遍历,长度为n的,和长度n-1,但不过n-1要加上1;
#include <bits/stdc++.h>
using namespace std;
const int N = 2010;
int a[N],g[N][N],n;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i+n]=a[i];
}
memset(g,0,sizeof(g));
for(int i=1;i<=2*n;i++)
{
g[i][i]=1;
}
for(int l=2;l<=2*n;l++)
{
for(int i=1;i<=2*n-l+1;i++)
{
int j=i+l-1;
if(a[i]==a[j])
g[i][j]=max(g[i][j],g[i+1][j-1]+2);
else
g[i][j]=max(g[i+1][j],g[i][j-1]);
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,g[i][i+n-1]);
ans=max(ans,g[i][i+n-2]+1);
}
cout<<ans<<endl;
}
return 0;
}