#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn =
200 +
5;
struct Segment {
int color,
len;
Segment(
int c,
int l) : color(c),
len(l) {}
Segment() {}
};
int block[maxn], n, d[maxn][maxn][maxn];
Segment seg[maxn];
bool deleted[maxn];
int dp(
int from,
int to,
int len) {
if(d[from][to][
len] !=
-1)
return d[from][to][
len];
if(from == to)
return d[from][to][
len] = (seg[to].
len +
len) * (seg[to].
len +
len);
int ans = dp(from, to -
1,
0) + (seg[to].
len +
len) * (seg[to].
len +
len);
for(
int i = from; i < to; i++) {
if(seg[i].color == seg[to].color) {
ans = max(ans, dp(i
+1, to
-1,
0) + dp(from, i, seg[to].
len +
len));
}
}
return d[from][to][
len] = ans;
}
int main()
{
int T, kase =
0;
scanf(
"%d", &T);
while(T--) {
memset(d,
-1, sizeof(d));
scanf(
"%d", &n);
for(
int i =
0; i < n; i++)
scanf(
"%d", &block[i]);
int len =
0, dex =
0;
seg[dex] = Segment(block
[0],
1);
for(
int i =
1; i < n; i++) {
if(block[i] == block[i
-1]) seg[dex].
len++;
else seg[++dex] = Segment(block[i],
1);
}
printf(
"Case %d: %d\n", ++kase, dp
(0, dex,
0));
}
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-1295980.html