wsfw 卡在最后的答案统计了,看了别人的博客,觉得很有道理。
先破环成链,答案有两种情况:
1.在一段区间(最长为n)中的回文子序列:12321。两人站在l,r的位置开始行动
2.对于一个长度为n-1的序列来说,str[l-1]==str[r+1]
,所以有一种情况是两人站在l-1,r+1的位置开始行动。(说白了,l-1,r+1是同一个点,这种情况就是起点相同的情况。)
#include <bits/stdc++.h>
using namespace std;
//-----pre_def----
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
#define fir(i, a, b) for (int i = (a); i <= (b); i++)
#define rif(i, a, b) for (int i = (a); i >= (b); i--)
#define endl '\n'
#define init_h memset(h, -1, sizeof h), idx = 0;
#define lowbit(x) x &(-x)
//---------------
const int N = 2e3 + 10;
int n, d[N];
int f[N][N];
void init() {}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int StartTime = clock();
#endif
while (scanf("%d", &n), n)
{
fir(i, 1, n)
{
scanf("%d", &d[i]), d[i + n] = d[i];
}
n <<= 1;
memset(f, 0, sizeof f);
fir(i, 1, n) f[i][i] = 1;
int ans = 0;
fir(len, 2, n)
{
for (int l = 1; l + len - 1 <= n; l++)
{
int r = l + len - 1;
//f[l][r]
if (d[l] == d[r])
{
f[l][r] = max(f[l][r], f[l + 1][r - 1] + 2);
}
else
{
f[l][r] = max({f[l][r], f[l + 1][r], f[l][r - 1]});
}
}
}
fir(i, 1, n / 2)
{
ans = max({ans, f[i][i + n / 2 - 1], f[i][i + n / 2 - 2] + 1});
}
printf("%d\n", ans);
}
#ifndef ONLINE_JUDGE
printf("Run_Time = %d ms\n", clock() - StartTime);
#endif
return 0;
}