下次亲自来A了
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=205;
int color[maxn],len[maxn],after[maxn];
int dp[maxn][maxn][maxn];
int main()
{
int m,n,T,caseid=0;
int i,j,l,r,k,p,id;
int seq[maxn],cnt;
bool vis[maxn];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
scanf("%d",&seq[1]);
id=cnt=1;
for(i=2;i<=n;i++)
{
scanf("%d",&seq[i]);
if(seq[i]==seq[i-1])
{
cnt++;
}
else
{
color[id]=seq[i-1];
len[id++]=cnt;
cnt=1;
}
}
color[id]=seq[n];
len[id++]=cnt;
memset(vis,0,sizeof(vis));
for(i=id-1;i>=1;i--)
{
if(vis[i])
{
continue;
}
after[i]=0;
int tmp=i;
for(j=i-2;j>=1;j--)
{
if(color[j]==color[tmp])
{
after[j]=after[tmp]+len[tmp];
tmp=j;
vis[j--]=true;
}
}
}
memset(dp,0,sizeof(dp));
for(j=1;j<id;j++)
{
for(l=1;l+j-1<id;l++)
{
r=l+j-1;
for(k=0;k<=after[r];k++)
{
dp[l][r][k]=dp[l][r-1][0]+(len[r]+k)*(len[r]+k);
for(p=r-2;p>=l;p--)
{
if(color[p]==color[r])
{
dp[l][r][k]=max(dp[l][r][k],dp[l][p][k+len[r]] +
dp[p+1][r-1][0]);
}
}
}
}
}
printf("Case %d: %d\n",++caseid,dp[1][id-1][0]);
}
return 0;
}