POJ 1190 生日蛋糕

要做n层的蛋糕,从第n层开始做,到第一层,这是一道dfs,另外,这道题需要剪枝4次;
大体框架就是,
1、我们找到最底层半径r以及高h的取值范围;
怎么找呢,r、h的最小值可以很容易判断,因为要求从下到上要求蛋糕的半径和高度要递减,r、h又为整数,所以r,h的最小值要至少为n;找到最小之后,就可以来求最大值;
rrh= V(最底层);
首先我们要求前M-1层的最小值,然后就会得到最底层的最大值;求前M-1层的最小值,即求每一层的最小值;每一层的最小值怎么求呢?可以递推,第一层的最小值是什么,当r和h取什么值的时候取得?由圆柱体积公式,显然,当r和h都取最小值的时候取得,又r和h为正整数,所以当r和h都取1的时候取得,即当r == 1 && h == 1的时候取得;这时候怎么递推呢,可以用一个for循环,来累加,每一层的r和h的最小值即r和h从上到下一层加一;这样求出每一层的最小值,在加上前面所有层的最小值即可求出前M-1层的最小值,就可以求出最底层的最大值;
2、然后就进行dfs,递归要搭的体积,多少层,目前未建好的最底层的高度和半径;递归终止的条件就是当n == 0时,即已经建完了n层蛋糕,如果v不为0,证明不合理,就返回,否则就取之前最小的体积和当前的体积的最小值,如果在递归过程中要搭建的体积不大于0了,就返回,因为每一层的体积肯定大于等于0;然后就是两个嵌套for循环来枚举;枚举半径和高度,从最大值到最小值或者从最小值到最大值;在外循环需要加一个判断,如果是最底层的话,需要求出最底层的底面积,这样就不用每一层都求了,因为要抹奶油,奶油除了要在侧面抹,也要在上面抹,而最底层的底面积就是所有层上面暴露部分的和;
以上是大体框架;
3、剪枝;
一、如果已经搭建的体积或搭建完的最小体积(不管是否正确取最小值)一定会大于minArea,就返回;搭建完的最小体积就是已经搭建的体积加上剩余层数的最小体积,在main中已经求得;
二、未搭建的最小体积一定会大于剩下的体积,返回;
三、未搭建的最大体积一定会小于剩下的体积,返回;未搭建的最大体积就是从未搭建的最底层开始,取当前的r和h,然后取每一层最大的r和h,即每层r和h都只减1;
四、若r和h小于当前层数,一定不对,返回;因为第一层r和h的最小值至少为1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值