poj1390 Blocks

黑书上的方块消除

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n;
struct node
{
    int len;
    int color;
};
node p[220];
int pnum;
int a[220];
int d[220][220][220];
int found(int m,int i)
{
    int j;
    for(j=i;j<=m-1;j++)
    {
        if(p[j].color==p[m].color)
        {
            return j;
        }
    }
    return -1;
}
void dp(int i,int j,int k)//i到j段消去得到的最大值
{
    if(i==j)
    {
        d[i][j][k]=(p[i].len+k)*(p[i].len+k);
        return;
    }
    if(d[i][j-1][0]==-1)
    {
        dp(i,j-1,0);
    }
    if((p[j-1].color!=p[j].color)&&d[i][j][k]<d[i][j-1][0]+(p[j].len+k)*(p[j].len+k))
    {
        d[i][j][k]=d[i][j-1][0]+(p[j].len+k)*(p[j].len+k);
    }
    int temp;
    int zhong,qi;
    zhong=j;
    qi=i;
    while(1)
    {
        temp=found(zhong,qi);
        if(temp==-1)
        {
            break;
        }
        if(d[i][temp][k+p[j].len]==-1)
        {
            dp(i,temp,k+p[j].len);
        }
        if(d[temp+1][j-1][0]==-1)
        {
            dp(temp+1,j-1,0);
        }
        if(d[i][j][k]<d[i][temp][k+p[j].len]+d[temp+1][j-1][0])
        {
            d[i][j][k]=d[i][temp][k+p[j].len]+d[temp+1][j-1][0];
        }
        qi=temp+1;
    }
}
int main()
{
    int total;
    scanf("%d",&total);
    int np=1;
    while(total--)
    {
        scanf("%d",&n);
        int i,j;
        scanf("%d",&a[0]);
        int tempcolor=a[0];
        int templen=1;
        pnum=0;
        for(i=1;i<n;i++)
        {
            scanf("%d",&a[i]);
            if(tempcolor==a[i])
            {
                templen++;
            }
            else
            {
                p[pnum].color=tempcolor;
                p[pnum++].len=templen;
                tempcolor=a[i];
                templen=1;
            }
        }
        p[pnum].color=tempcolor;
        p[pnum++].len=templen;
        int k;
        for(i=0;i<pnum;i++)
        {
            for(j=0;j<pnum;j++)
            {
                for(k=0;k<220;k++)
                {
                    d[i][j][k]=-1;
                }
            }
        }
        dp(0,pnum-1,0);
        printf("Case %d: %d\n",np++,d[0][pnum-1][0]);
    }
    return 0;
}

复杂度为n^4   

posted @ 2012-08-04 12:48  willzhang  阅读(211)  评论(0编辑  收藏  举报