解题思路
思路太长,推片博客吧》》注意法二才是正解.
代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int t,n,cnt,w,m,s[210],c[210],a[210],f[210][210][210];
int solve(int l,int r,int k){
if(f[l][r][k])return f[l][r][k];
if(l==r)return (c[r]+k)*(c[r]+k);
f[l][r][k]=solve(l,r-1,0)+(c[r]+k)*(c[r]+k);
for(int i=l;i<=r-1;i++)
if(a[i]==a[r])
f[l][r][k]=max(f[l][r][k],solve(l,i,c[r]+k)+solve(i+1,r-1,0));
return f[l][r][k];
}
int main() {
scanf("%d",&t);
while(t--) {
m++;
scanf("%d",&n);
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
int last=-1;
cnt=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&s[i]);
if(s[i]!=last)
{
a[++cnt]=s[i];
c[cnt]++;
}
else c[cnt]++;
last=s[i];
}
printf("Case %d: %d\n",m,solve(1,cnt,0));
}
}