#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=200+10;
int n,A[maxn],d[maxn][maxn][maxn];
int dp(int i,int j,int k)//表示对区间[i,j]后面还跟了k个和A[j]相同颜色的方块
{
if(i>j)return 0;
int& ans=d[i][j][k];
if(ans>=0)return ans;
int p=j;
while(p>=i&&A[p]==A[j])p--;//
p++;
ans=dp(i,p-1,0)+(j-p+1+k)*(j-p+1+k);//直接消去这一段
for(int q=i;q<p;q++)//
{
if(A[q]==A[j]&&A[q]!=A[q+1])
{
ans=max(ans,dp(q+1,p-1,0)+dp(i,q,j-p+1+k));
//先消去[q+1,p-1]这一段q+1,p-1不同于j,因为后来消去也没有好处;然后还剩下一段接着处理。
}
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&A[i]);
memset(d,-1,sizeof(d));
printf("Case %d: %d\n",kase,dp(0,n-1,0));
}
return 0;
}
UVA10559 Blocks
最新推荐文章于 2020-11-26 11:23:52 发布