能够拿到n<=2000的分但是不能拿到n<=15的,很神奇
#include <bits/stdc++.h>
#define int long long
using namespace std;
int t, n, m, a[2010], f[2][2010][2010];
int real(int x) {
return (x & 1);
}
signed main() {
cin >> t;
while (t--) {
memset(f, 0, sizeof(f));
memset(a, 0, sizeof(a));
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i < n; i++) {
for (int j = 1; j < i; j++) { //染蓝 枚举红
if (a[j] == a[i + 1])f[real(i + 1)][i + 1][i] = max(f[real(i + 1)][i + 1][i], f[real(i)][j][i] + a[i + 1]); //
else f[real(i + 1)][i + 1][i] = max(f[real(i + 1)][i + 1][i], f[real(i)][j][i]);
if (a[i] == a[i + 1])f[real(i + 1)][j][i + 1] = max(f[real(i + 1)][j][i + 1], f[real(i)][j][i] + a[i + 1]); //
else f[real(i + 1)][j][i + 1] = max(f[real(i + 1)][j][i + 1], f[real(i)][j][i]);
if (a[j] == a[i + 1])f[real(i + 1)][i][i + 1] = max(f[real(i + 1)][i][i + 1], f[real(i)][i][j] + a[i + 1]); //
else f[real(i + 1)][i][i + 1] = max(f[real(i + 1)][i][i + 1], f[real(i)][i][j]);
if (a[i] == a[i + 1])f[real(i + 1)][i + 1][j] = max(f[real(i + 1)][i + 1][j], f[real(i)][i][j] + a[i + 1]); //
else f[real(i + 1)][i + 1][j] = max(f[real(i + 1)][i + 1][j], f[real(i)][i][j]);
}
}
m = 0;
int l = real(n);
for (int i = 1; i < n; i++) {
m = max(m, f[l][i][n]);
m = max(m, f[l][n][i]);
}
cout << m << "\n";
}
return 0;
}