感觉没错啊。
#include<bits/stdc++.h>
#define int long long
#define min(a,b) a<b?a:b
using namespace std;
int f[35][35][35];
int w(int x,int y,int z){
if(x<=0||y<=0||z<=0)
return 1;
else if(x>20||y>20||z>20)
return w(20,20,20);
else if(f[x][y][z])
return f[x][y][z];
else if(x<y&&y<z)
return f[x][y][z]=w(x,y,z-1)+w(x,y-1,z-1)-w(x,y-1,z);
else
return f[x][y][z]=w(x-1,y,z)+w(x-1,y-1,z)+w(x-1,y,z-1)-w(x-1,y-1,z-1);
}
signed main(){
long long a,b,c,x,y,z,m;
while(scanf("%lld%lld%lld",&a,&b,&c)&&(a!=-1||b!=-1||c!=-1)){
memset(f,0,sizeof(f));
x=min(a,21),y=min(a,21),z=min(c,21);
if(a<=0||b<=0||c<=0){
printf("w(%lld, %lld, %lld) = 1\n",a,b,c);
continue;
}
m=w(x,y,z);
printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,m);
}
return 0;
}