高楼扔鸡蛋问题

高楼扔鸡蛋问题

这个问题问的是有N层楼,K个鸡蛋,有第1<=F<=N层楼鸡蛋刚好不碎,最坏情况下至少扔多少次鸡蛋?

对于这道问题比较难的就是理解题目的意思,穷举的本身和代码并不难,但是理解题目,解析出来比较难。现在我来谈谈自己对这道题目的思考。如果有不正确的地方希望大家能够指出。

1.首先我需要抛出问题
①什么是最坏的情况如何理解?②至少扔多少次鸡蛋在这道题又应该如何理解③为什么动态规划可以解决这道题

现在我一个一个问题来解析。**最坏的情况什么意思?**现在举一个例子,在我们不考虑鸡蛋数目的情况下,我们以第一种策略来测试,这个策略就是从第一层开始一层一层地扔,那么最坏的情况就是就是刚好这个鸡蛋需要在第N层的时候才会碎。那么这个就是这个策略的最坏情况。
现在举第二种策略就是10层10层地跳着扔,那么我们最坏的情况就是从第一层开始10层10层跳着扔直到第N层,那么我们就需要扔N/10次。
现在再来一种策略就是二分策略,那么在不计算鸡蛋的情况下,我们就需要扔log2N次。
我们看看现在这三种策略的最坏的情况就是我上面列举的情况,但是随着F的改变,最坏的情况也会改变,但是我们现在可以知道的是无论是什么策略都会有自己最坏的情况。策略可以是在10层扔,然后跳2层扔,各种各样的。

我们发现似乎二分就是最好的解法,但是实际上并不是,因为我们的鸡蛋数是有限制的。

第二个问题:至少扔多少次鸡蛋,我们可以看上面那三种策略的最坏情况,谁扔鸡蛋最少就是这个问题的解。也就是说我们需要求的是各种策略中最坏的情况下,谁扔的鸡蛋最少。
那么简单来说高楼扔鸡蛋问题可以简单地变成一个数学问题
A事件:各种策略的最坏情况扔鸡蛋的次数
B事件:谁扔的鸡蛋最少
在A的情况下,求B

第三个问题:为什么可以使用动态规划,我们来看看这道题。有没有发现它是有状态和选择的。状态是什么?我们思考一下,我们在哪里丢鸡蛋?鸡蛋会不会碎?也就是说这个问题的状态就是我们可能在第几层上丢鸡蛋,鸡蛋碎了应该怎么做,没有碎的话怎么做。这样就能够定义我们的dp(k,n)了,它的定义就是在有k个鸡蛋,在第n层楼的时候最坏情况需要扔多少次鸡蛋,因为我们的返回值是int。

那么怎么进行状态转移呢?
我们简单想一下,我们有什么选择,鸡蛋要么碎了,我们往下层,鸡蛋不碎我们往上面走。如果鸡蛋碎了就不能再使用了所以k-1,鸡蛋数减少,假设现在是第x层,往上层走的话就需要继续遍历
[x+1,n]层,如果没有碎,那么只需要改变层数,我们还需要遍历[1,x-1]层.然后我们原本的状态
dp(k,n)就能转换成另一个问题Math.max(dp(k-1,n-x),dp(k,x-1)).这里的n和n-x还有x-1的意思就是还需要遍历多少层。这里只是计算了最坏情况下需要扔多少次鸡蛋。我们还需要计算他们之间最少的扔鸡蛋数也就是minEgg
for(遍历从1到n的楼层)
minEgg=Math.min(minEgg,Math.max(dp(k-1,n-x),dp(k,x-1))+1).
我们不知道遍历哪一个楼层,所以全部都试试,这样就能够穷举所有的情况了。最后我们只需要设置一个备忘录就可以了还有两个终止事件。一个是当鸡蛋数等于1的时候,我们就需要返回n,因为是考虑到最坏的情况,所以一定是需要从第一层开始扔到最后一层鸡蛋才会刚好碎,如果n=0的时候,我们就不能再扔了就只能返回0了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值