问题出处:中文版 LeetCode 第 887 题 - 鸡蛋掉落 问题
问题描述:(源自 LeetCode)
你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。
每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。
你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。
每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。
你的目标是确切地知道 F 的值是多少。
无论 F 的初始值如何,你确定 F 的值的最小移动次数是多少?
问题理解:
给定两个参数 K个鸡蛋 和 N层楼,目标是在任何F值情况下,寻找 最小移动次数。
由于F值可以为任意值,则 最小移动次数 的下限应该取 最坏情况 下的值。
因此,问题的核心是寻找一种在 最坏情况 下的 最优方案。
由于鸡蛋的数量在寻找过程中是变化的,即某一步骤的鸡蛋数量,取决于前一步骤的鸡蛋是否破碎。
因此,尝试使用 动态规划 的方法来解决问题。
动态规划:
首先,要确定每一步之间的关系表达式,设 最小移动次数 为 ,关系表达式为
,即
。
然后,假设第一步在 X 层掉落鸡蛋,则存在两种情况:
(1)鸡蛋破碎:剩余 K - 1 个鸡蛋,剩余需要确认的楼层数为 X - 1 层;
(2)鸡蛋完好:剩余 K 个鸡蛋,剩余需要确认的楼层数为 N - X 层;
此时,进入第二步尝试,问题已被拆分为两个子问题:
(1)给定 K - 1 个鸡蛋 和 X - 1 层楼,确定 最小移动次数,即 。
(2)给定 K 个鸡蛋 和 N - X 层楼,确定 最小移动次数,即 。
由于要找 最坏情况 下的解,因此,对于两个子问题的解,应该取较大的一个解,即