DP专辑之线性DP

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\n",cas,dfs(1,n,0));
    }
    return 0;
}


posted @ 2014-05-12 11:25  wolf940509  阅读(124)  评论(0编辑  收藏  举报