@ysner
2018-09-18T08:00:45.000000Z
字数 1173
阅读 2731
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;}
