poj 1579

刚开始看到这道题递归,一直在想可以不以剪枝

但是发现没用

其实这道题和滑雪有点像

因为之前刚做完滑雪

都是要保存状态

也可以说是剪枝

其实用递归可以



这道题从上到下都可以由上一步推导下一步

这样就可以有数组模拟递归的过程了



#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]);
		}
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值