刚开始看到这道题递归,一直在想可以不以剪枝
但是发现没用
其实这道题和滑雪有点像
因为之前刚做完滑雪
都是要保存状态
也可以说是剪枝
其实用递归可以
这道题从上到下都可以由上一步推导下一步
这样就可以有数组模拟递归的过程了
#include<stdio.h>
int ww[21][21][21]={0};
/*
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(x<y&&y<z)
{
return (w(x, y, z-1) + w(x, y-1, z-1) - w(x, y-1, z));
}
else
{
return (w(x-1, y, z) + w(x-1, y-1, z) + w(x-1, y, z-1) - w(x-1, y-1, z-1));
}
}
*/
int main()
{
int x=0,y=0,z=0;
for( x=0;x<21;x++)
for(y=0;y<21;y++)
for(z=0;z<21;z++)
{
if(x==0||y==0||z==0)
ww[x][y][z]=1;
else if(x<y&&y<z)
ww[x][y][z]=ww[x][y][z-1]+ww[x][y-1][z-1]-ww[x][y-1][z];
else
{
ww[x][y][z]=ww[x-1][y][z]+ww[x-1][y-1][z]+ww[x-1][y][z-1]-ww[x-1][y-1][z-1];
}
}
while(1)
{
scanf("%d%d%d",&x,&y,&z);
if(x==-1&&y==-1&&z==-1)
break;
if(x<=0||y<=0||z<=0)
{
printf("w(%d, %d, %d) = %d\n",x,y,z,1);
}
else if(x>20||y>20||z>20)
{
printf("w(%d, %d, %d) = %d\n",x,y,z,ww[20][20][20]);
}
else
{
printf("w(%d, %d, %d) = %d\n",x,y,z,ww[x][y][z]);
}
}
}