POJ1390
题目链接:http://poj.org/problem?id=1390
分类:记忆化搜索
dp[i][j][k] 表示,从i到j块且j后面有k块与第j块的颜色一样。dp[l][r][k] = max(dp[l][r][k],dfs(l,i,k+1)+dfs(i+1,r-1,0));
解题思路:见黑书123页【例题1】方块消除
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=210;
int dp[maxn][maxn][maxn];
int re[maxn];
int dfs(int i,int j,int k)
{
if(i>j) return 0;
if(dp[i][j][k]) return dp[i][j][k];
dp[i][j][k]=dfs(i,j-1,0)+(1+k)*(1+k);
for(int p=j-1;p>=i;p--)
if(re[p]==re[j])
dp[i][j][k]=max(dp[i][j][k],dfs(i,p,k+1)+dfs(p+1,j-1,0));
return dp[i][j][k];
}
int main()
{
int T,n;
cin>>T;
for(int cas=1;cas<=T;cas++)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&re[i]);
memset(dp,0,sizeof(dp));
printf("Case %d: %d
",cas,dfs(1,n,0));
}
return 0;
}