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; }