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