题目链接: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; }