原题: http://poj.org/problem?id=1579
//记忆化搜索
#include<cstdio>
int dp[22][22][22]={1};
int w(int a,int b,int c)
{
if (a <= 0 || b <= 0 || c <= 0)
{
return 1;
}
if(a > 20 || b > 20 || c > 20)//控制在20以下了
{
if(dp[20][20][20]!=0)
{
return dp[20][20][20];
}
dp[20][20][20]=w(20,20,20);
return dp[20][20][20];
}
if(dp[a][b][c]!=0)
{
return dp[a][b][c];
}
if( a < b && b < c)
{
dp[a][b][c]=w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) ;
return dp[a][b][c];
}
dp[a][b][c]=w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) ;
return dp[a][b][c];
}
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
while(!(a==-1 && b==-1 &&c==-1))
{
printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
scanf("%d %d %d",&a,&b,&c);
}
return 0;
}