这道题状态方程都给出来了,直接敲代码就行了
#include <stdio.h>
#include <string.h>
int w[25][25][25];
int vis[25][25][25]; //标记是否算过了 算过了就直接return对应的w值就行了(记忆化过程)
int Dfs(int x,int y,int z)
{
if(x>0&&x<=20&&y>0&&y<=20&&z>0&&z<=20&&vis[x][y][z])return w[x][y][z];
if(x>0&&x<=20&&y>0&&y<=20&&z>0&&z<=20)vis[x][y][z]=1;
if(x<=0||y<=0||z<=0)return 1;
else if(x>20||y>20||z>20)return Dfs(20,20,20);
else if(x<y&&y<z)return Dfs(x,y,z-1)+Dfs(x,y-1,z-1)-Dfs(x,y-1,z);
else return Dfs(x-1,y,z)+Dfs(x-1,y-1,z)+Dfs(x-1,y,z-1)-Dfs(x-1,y-1,z-1);
}
int main()
{
int a,c,b,i,j,k;
memset(vis,0,sizeof(vis));
for(i=1;i<=20;i++)
{
for(j=1;j<=20;j++)
{
for(k=1;k<=20;k++)
{
w[i][j][k]=Dfs(i,j,k);
}
}
}
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
if(a==-1&&b==-1&&c==-1)break;
printf("w(%d, %d, %d) = %d\n",a,b,c,Dfs(a,b,c));
}
return 0;
}