@ysner
2018-09-18T16:00:45.000000Z
字数 1173
阅读 2202
DP
有个带有颜色的方块,消除一段长度为的连续的相同颜色的方块可以得到的分数。
用一种最优的顺序消除所有方块使得得分最多。
状态相当神仙。。。转移也很神仙。。。
设表示处理区间,后面还有个和右端点颜色相同的方块。
然后有三种转移:
据此记搜即可。
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
int T,n,f[205][205][205],a[205];
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il int pf(re int x){return x*x;}
il int dfs(re int l,re int r,re int k)
{
if(~f[l][r][k]) return f[l][r][k];
if(l>r) return 0;
re int &x=f[l][r][k],p;
x=dfs(l,r-1,0)+pf(k+1);
fp(i,l,r-1) p=dfs(l,i,0)+dfs(i+1,r,k),x=(x>p)?x:p;
fp(i,l,r-1)
if(a[i]==a[r]) p=dfs(l,i,k+1)+dfs(i+1,r-1,0),x=(x>p)?x:p;
return x;
}
int main()
{
re int T=gi();
fp(o,1,T)
{
n=gi();
fp(i,1,n) a[i]=gi();
memset(f,-1,sizeof(f));
printf("Case %d: %d\n",o,dfs(1,n,0));
}
return 0;
}