uva 10118
http://www.cnblogs.com/kedebug/archive/2013/04/07/3006493.html
#include<stdio.h> #include<string.h> #define N 45 #define C 22 int max(int a,int b) { return a>b?a:b; } int pile[4][N],f[N][N][N][N],n,top[4]; int dfs(int s,int hash[C]) { int i,j,ans=0; if(f[top[0]][top[1]][top[2]][top[3]]!=-1) { return f[top[0]][top[1]][top[2]][top[3]]; } if(s==5)//篮子满了,末状态 return f[top[0]][top[1]][top[2]][top[3]]=0; int h[C],t[4]; for(i=0;i<4;i++) { memcpy(h,hash,sizeof(h)); if(top[i]!=n)//到n是拿空了 { if(h[pile[i][top[i]]])//拿i堆顶,可以凑对 { h[pile[i][top[i]]]=0; top[i]++; ans=max(ans,dfs(s-1,h)+1); } else { h[pile[i][top[i]]]=1; top[i]++; ans=max(ans,dfs(s+1,h)); } top[i]--; } } return f[top[0]][top[1]][top[2]][top[3]]=ans; } int main() { int i,j,k,l,m; while(scanf("%d",&n)&&n) { memset(pile,0,sizeof(pile)); for(i=0;i<n;i++) { for(j=0;j<4;j++) scanf("%d",&pile[j][i]); } memset(f,-1,sizeof(f)); memset(top,0,sizeof(top)); int hash[C]={0}; printf("%d\n",dfs(0,hash)); } return 0; }