hdu1331(记忆化搜索)

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef __int64 ss;
#define max 55
#define p 10000000
ss n,m;
ss dp[max][max][max],dist[max];
int dfs(int a,int b,int c)
{
	int sum=0;
	if(dp[a][b][c])
	return dp[a][b][c];
	if(a<=0||b<=0||c<=0)
	sum=1;
	else if(a>20||b>20||c>20)
	sum=dfs(20,20,20);
	else if(a<b&&b<c)
	sum=dfs(a,b,c-1)+dfs(a,b-1,c-1)-dfs(a,b-1,c);
	else sum=dfs(a-1,b,c)+dfs(a-1,b-1,c)+dfs(a-1,b,c-1)-dfs(a-1,b-1,c-1);
	dp[a][b][c]=sum;
	return dp[a][b][c];
}
int main()
{
	int x,y,z;
	while(scanf("%d%d%d",&x,&y,&z)>0)
	{
		if(x==-1&&y==-1&&z==-1)
		break;
		memset(dp,0,sizeof(dp));
		printf("w(%d, %d, %d) = ",x,y,z);
		if(x<=0||y<=0||z<=0)
		{
			printf("1\n");
			continue;
		}
		if(x>20||y>20||z>20)
		x=y=z=20;
		printf("%d\n",dfs(x,y,z));
	}
	return 0;
}

 

posted @ 2013-07-19 11:27  紫忆  阅读(336)  评论(0编辑  收藏  举报