Uva 10118 免费糖果

题目链接:https://uva.onlinejudge.org/external/101/10118.pdf

参考:http://www.cnblogs.com/kedebug/archive/2013/04/07/3006493.html

刚开始,我想到了dp状态的描叙,d(a,b,c,d) 从 4堆里面拿走 a,b,c,d 的最优值,但是好难实现啊,dp顺序感觉是可以用LCS的方案,但是,怎么保存自己口袋里面有哪些呢? ——hash.

最后参考了一下大神的方案,记忆化写的,Orz.

嗯,像这种状态转移比较难写的,还是用搜索的思想好一点。

#include <bits/stdc++.h>
using namespace std;

const int Maxn = 42;
int pile[4][Maxn];
int dp[Maxn][Maxn][Maxn][Maxn];
int n,top[4];

int dfs(int count,bool hash[]) {
    if(dp[top[0]][top[1]][top[2]][top[3]]!=-1)
        return dp[top[0]][top[1]][top[2]][top[3]];
    if(count==5)
        return dp[top[0]][top[1]][top[2]][top[3]] = 0;

    int ans = 0;
    for(int i=0;i<4;i++) {
        if(top[i]==n) continue;
        int color = pile[i][top[i]];
        top[i]+=1;
        if(hash[color]) {
            hash[color] = false;
            ans = max(ans,dfs(count-1,hash)+1);
            hash[color] = true;
        }
        else {
            hash[color] = true;
            ans = max(ans,dfs(count+1,hash));
            hash[color] = false;
        }
        top[i]-=1;
    }
    return dp[top[0]][top[1]][top[2]][top[3]] = ans;

}

int main()
{

    while(scanf("%d",&n),n)
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<4; j++)
                scanf("%d",&pile[j][i]);

        bool hash[25];
        memset(dp,-1,sizeof(dp));
        memset(hash,false,sizeof(hash));

        top[0] = top[1] = top[2] = top[3] = 0;
        printf("%d
",dfs(0,hash));

    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/6035699.html