#include <stdio.h>
/*这道题是一个递归题,有一个三个参数的递归函数w(a,b,c)
*如果a<=0,b<=0,c<=0那么返回1
×如果a>20,b>20,c>20返回w(20,20,20)
*如果a<b,并且b<c返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,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)
*如果只是蛮力算法的话会很慢,所以我们要用打表算法,一共有21中情况,我们就记录这21种情况
×之后只要查阅就行了
* */
//存储中间结果
int f[21][21][21];
//递归函数
int w(int a,int b,int c){
if(a<=0||b<=0||c<=0) return 1;
if(a>20||b>20||c>20) return w(20,20,20);
if(f[a][b][c]>0) return f[a][b][c]; //这一步节省了时间,有些递归之前计算了就不用重复计算了
if(a<b && b<c) return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
}
int main(){
int a,b,c;
int i,j,k;
for(int i=0;i<=20;i++)
for(j=0;j<=20;j++)
for(k=0;k<=20;k++){
f[a][b][c] = w(a,b,c);
}
while(scanf("%d%d%d",&a,&b,&c) != EOF){
if(a==-1 && b==-1 && c==-1) return 0;
printf("w(%d, %d, %d)",a,b,c);
printf("%d\n",w(a,b,c));
}
return 0;
}
~