动态规划:鸡蛋掉落问题图文解析+Java实现

题目:
你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。

每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。

你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。

每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。

你的目标是确切地知道 F 的值是多少。

无论 F 的初始值如何,你确定 F 的值的最小移动次数是多少?
思路1:

死拿一个鸡蛋逐层尝试,最坏尝试为N,时间复杂度O(N)
(无法获得最少尝试次数)

思路2:

二分查找,一次尝试后N/2, 二次尝试后N/2^2, 三次尝试后N/23…假设要尝试K次,则N/2K , 最坏尝试时间复杂度为 O(log2(N))
但楼层为:1,2,3,4,5,6,7,8,9时,如果B=8,第一次选择5(尝试次数+1),没碎,在剩余的6789再向下取中间数7(尝试次数+1),没碎,继续取中间数(尝试次数+1),在剩余89向下取8(尝试次数+1),没碎,取9(尝试次数+1),碎了,确定B=8,尝试次数5
其实第一次取4(尝试次数+1),没碎,在56789取7(尝试次数+1),没碎,在89取8(尝试次数+1),没碎,取9(尝试次数+1),碎了
确定B=8,最大尝试次数只需4次
而且这里最大的问题,就是忽视了鸡蛋数量限制
(无法获得最少尝试次数,二分法失败)

思路3:

解法一:
倒推,根据X个鸡蛋,尝试N次,能最大检测多少楼层,当能检测的楼层大于题目给出的楼层数后,N次就是最少尝试次数
例如:楼层=9,鸡蛋=2,尝试次数N最小为4
在分析中,我们不难发现,0个鸡蛋或者尝试0次,是测不出楼层的
同时:
一个鸡蛋的情况下,尝试N次,只能探索N层楼
一次尝试的情况下,不管有X个鸡蛋,都只能探索1层楼
列出如下表:
在这里插入图片描述

根据上表,我们继续推算:

当有2次尝试的情况下,并且手上有2个鸡蛋,我直接2楼扔一个,
(1)碎了,还剩1个鸡蛋1次尝试,只能探索一层楼,去探索临界点1楼
(2)没碎,还剩2个鸡蛋1次尝试,只能探索一层楼,我再去三楼扔一个,不管碎没碎,我移动次数也用完了,只能探索到这里,所以我最少能够探索3层楼
于是,尝试2次的情况下,手上的鸡蛋>=2, 我都只能探索3楼及以下的楼层
补充表格:
在这里插入图片描述
当有3次尝试的情况下,且手上2个鸡蛋,我直接上3楼扔一个,
(1)碎了,剩余1个鸡蛋和2次尝试,根据图表推算,可以探索2层楼
在这里插入图片描述
(2)没碎,剩余2个鸡蛋,2次尝试,根据图表推算,还可以探索3层楼
在这里插入图片描述
加上当前次尝试探索的楼层,得2+3+1=6

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值