UVA10559 Blocks

来源:互联网 发布:拷贝软件下载 编辑:程序博客网 时间:2024/05/16 11:01
#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;}
0 0