这个题目虽然在比赛的时候苦思无果,但是赛后再做就真的是个水题,赤果果的水题。
题目的意思是给n个数构成的环,两只兔子从任一点开始分别顺逆时针跳,每次可以调到任意一个数(最多不会跳过一圈)。
求最多能跳多少步。
这个题目是个dp,两个不同的方向开始跳跃,而且跳过的数字相同,那么就是要你求回文子串啦,
可以这样考虑,用dp的方法求出从一个位置到另一个位置的最长回文子串的长度,这样等于把【1-n】个数分成两个区间【1-x】和【x+1,n】,
而答案就是两个区间最长回文串之和。(仔细理解这里,这是关键)。
后面的就不多说了,dp也没什么好写的了。
直接上代码:
#include <iostream> #include <cstdio> #include <cstring> #define maxn 1001 using namespace std; int a[maxn],f[maxn][maxn],n,m,i,j; int main() { while (scanf("%d",&n) && n) { memset(f,0,sizeof f); for (i=1; i<=n; i++) scanf("%d",&a[i]),f[i][i]=1; for (i=2; i<=n; i++) { for (j=i-1; j>0; j--) { f[j][i]=max(f[j+1][i],f[j][i-1]); if (a[i]==a[j]) f[j][i]=2+f[j+1][i-1]; } } m=0; for (i=1; i<=n; i++) m=max(m,f[1][i]+f[i+1][n]); printf("%d ",m); } return 0; }
Accepted | 4800 KB | 62 ms | C++ | 606 B |