- 求最大的非连续回文串
- 注意相等时更新为+2 否则枚举内部
- 最后答案应为要成环 枚举端点切断两边各自中点可以成为对应位置
#include <iostream>
#include <cstdio>
#include <cstring>
#define mem(a,b) memset(a,b,sizeof a)
#define sci(num) scanf("%d",&num)
using namespace std;
const int MAX_N = 1010;
int N;
int dp[MAX_N][MAX_N];
int nums[MAX_N];
int main() {
while (scanf("%d",&N)) {
if (N == 0) break;
mem(dp,0);
for (int i = 1;i <= N;i++)
sci(nums[i]);
for (int i = 1;i <= N;i++)
dp[i][i] = 1;
for (int len = 1;len < N;len++) {
for (int i = 1;i + len <= N;i++) {
dp[i][i + len] = max(dp[i + 1][i + len],dp[i][i + len - 1]);
if (nums[i] == nums[i + len]) {
dp[i][i + len] = dp[i + 1][i + len - 1] + 2;
}
}
}
int ans = 0;
for (int i = 0;i <= N;i++) {
ans = max(ans,dp[1][i] + dp[i + 1][N]);
}
printf("%d\n",ans);
}
return 0;
}
``