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;

}

 

你可能感兴趣的:(HDU)