您的位置:首页 > 其它

uva 10118 免费糖果 深搜+记忆化搜索

2013-04-24 09:55 232 查看
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]
,f

,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: