把方块按颜色分段,color[i]表示这段方块的颜色,len[i]表示这段方块的长度
dp[i][j][k]表示从i段到j段,第j段之后有k个方块与第j段颜色相同
对第j段,有两种处理方法
直接消除或者与前面的某一段一起消除
dp[i][j][k] = max(dp[i][j-1][0]+(len[j]+k)*(len[j]+k),dp[i][p][len[j]+k]+dp[i][j-1][0]);
#include<iostream> using namespace std; int dp[203][203][203],len[203],color[203]; int max(int a,int b) { return a > b ? a : b; } void dfs(int i,int j,int k) { if(dp[i][j][k] != 0) return ; if(i == j) { dp[i][j][k] = (len[j]+k)*(len[j]+k); return ; } dfs(i,j-1,0); dp[i][j][k] = dp[i][j-1][0] + (len[j]+k)*(len[j]+k); for(int p = j-1;p >= i;p--) if(color[p] == color[j]) { dfs(i,p,len[j]+k); dfs(p+1,j-1,0); dp[i][j][k] = max(dp[i][j][k],dp[i][p][len[j]+k] + dp[p+1][j-1][0]); } } int ma