问题来源:力扣算法面试汇总

问题描述:你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。

你的目标是确切地知道 F 的值是多少。无论 F 的初始值如何,你确定 F 的值的最小移动次数是多少?

例子
输入:K = 1, N = 2
输出:2
解释:
鸡蛋从 1 楼掉落。如果它碎了,我们肯定知道 F = 0 。
否则,鸡蛋从 2 楼掉落。如果它碎了,我们肯定知道 F = 1 。
如果它没碎,那么我们肯定知道 F = 2 。
因此,在最坏的情况下我们需要移动 2 次以确定 F 是多少。

# 输入
K = 1
N = 2

以下分析内容主要参考题解中@labuladong的解答。

分析:一般这种带有生活场景的题目,都是要用动态规划。

  • 问题目标:最坏情况下的最小移动次数。

解释:

  • 对于我们如何选择楼层进行测试,是有很多种选择或者策略的。比如,我们可以选择依次从1层到最高层扔鸡蛋;或者每次选择从中间楼层扔鸡蛋。

  • 每个策略下,都有最好的情况或者最坏的情况。比如,依次从1层扔到最高层,最好的情况是在第一层就发现鸡蛋碎了,这样就只扔一次;但最坏的情况下,我们一直扔到最高层才发现鸡蛋碎了,这样就要扔N次。

  • 最坏情况下的最小移动次数,就是要找最佳策略,使得这个策略下,最坏情况在所有策略中是最小的。

上面我们确定了问题,接下来用动态规划来解决。对于动态规划,我们要确定两点,即问题的状态和选择。

  • 问题的状态:当前鸡蛋总数K和楼层总数N
  • 选择:选择楼层X来扔鸡蛋。显然,1≤X≤N1\le X\le N1≤X≤N。

这样,我们初步的动态规划框架为

# 当前状态为K个鸡蛋,N层楼
# 返回这个状态下最优结果
def dp(K, N):int resfor 1<=X<=N:res = min(res, 在第X层楼上扔鸡蛋的结果)return res

这个时候,在第X层楼上扔鸡蛋的结果如何表示?在第X层楼上扔鸡蛋,

  • 如果鸡蛋没碎,那么接下来应该测试第X+1层楼至第N层楼,这样,子问题的状态就变成K个鸡蛋,N-X层楼,结果为dp(K,N−X)dp(K, N-X)dp(K,N−X)
  • 如果鸡蛋破碎,那么接下来应该测试第1层楼至第X-1层楼,这样,子问题的状态就变成K-1个鸡蛋,X-1层楼,结果为dp(K−1,X−1)dp(K-1,X-1)dp(K−1,X−1)
  • 由于我们要选择最坏情况,所以我们在第X层楼上扔鸡蛋的结果应该是max(dp(K,N−X),dp(K−1,X−1))+1max(dp(K, N-X), dp(K-1,X-1))+1max(dp(K,N−X),dp(K−1,X−1))+1

所以我们的程序为

# 当前状态为K个鸡蛋,N层楼
# 返回这个状态下最优结果
def dp(K, N):for 1<=X<=N:res = min(res, max(dp(K, N-X), dp(K-1,X-1))+1)return res

接下来,递归的base case为

  • 当K=1K=1K=1,即只有一个鸡蛋时,只能从最底层往上遍历,因此,dp(1,N)=Ndp(1, N)=Ndp(1,N)=N
  • 当N=1N=1N=1,即只有一层楼时,无论有多少鸡蛋都只需要测试一次,因此,dp(K,1)=1dp(K, 1)=1dp(K,1)=1

我们添加一个备忘录memo以防止重复计算,即

# 当前状态为K个鸡蛋,N层楼
# 返回这个状态下最优结果
def dp(K, N):if K == 1: return Nif N == 1: return 1memo = {}if (K, N) in memo:return memo[(K, N)]res = float('inf')for 1<=X<=N:res = min(res, max(dp(K, N-X), dp(K-1,X-1))+1)memo[(K, N)] = resreturn res

鸡蛋掉落(动态规划)相关推荐

  1. [Leedcode][JAVA][第887题][鸡蛋掉落][谷歌面试][动态规划]

    [问题描述] [887. 鸡蛋掉落] 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去.你知道存在楼层 F ,满足 ...

  2. 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)

    题目: 思路: 先放上视频讲解 动态规划经典题目:鸡蛋掉落https://www.zhihu.com/video/1225199247848513536 纠正:视频里的状态转移方程漏写了一个+1,意思 ...

  3. 装鸡蛋的鞋子java代码_Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)...

    887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  4. LeetCode887之鸡蛋掉落(相关话题:动态规划,二分法)

    前言 但是这道题的解法技巧很多,光动态规划就好几种效率不同的思路,最后还有一种极其高效数学解法.秉承咱们号一贯的作风,拒绝奇技淫巧,拒绝过于诡异的技巧,因为这些技巧无法举一反三,学了不太划算 问题描述 ...

  5. LeetCode887. 鸡蛋掉落

    887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  6. LeetCode887题:鸡蛋掉落——动态规划法与数学法

    1. 问题介绍 关于临界楼层查找问题的最优查找策略,我已经在上一篇博客摔玻璃球(鸡蛋)查找临界楼层中做了详细讲解,本文将继续研究相关问题. 假如题目不要求给出具体的最优查找策略,只问最坏情况下至少需要 ...

  7. 算法题:鸡蛋掉落(leetcode 887题)

    题目: 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  8. 每日一题 11.4 鸡蛋掉落

    每日一题 11.4 鸡蛋掉落 一.题目概述 这是一道困难题,难度肯定是比前三天的要大的,这个毋庸置疑,但是毕竟趣味性在这里摆着,和昨天那个相比,钻研这个的兴趣要更大一点,昨天那个并查集和哈希表实在是太 ...

  9. LeetCode887题:鸡蛋掉落——官方题解方法一、二详解

    关于LeetCode887题:鸡蛋掉落的解法,我在LeetCode887题:鸡蛋掉落--动态规划法与数学法中已经讲得很清楚了,但其官方题解中有新的解法,本文将对其方法一和方法二进行解读. 首先定义变量 ...

  10. 【leetcode】鸡蛋掉落问题

    在leetcode刷动态规划问题过程中,鸡蛋掉落问题是比较经典的,特别是笔试面试喜欢出的问题.腾讯,Vivo等大厂都出现过,在这里通过自己学习,以及借鉴大佬的思路,对这道题进行整理. 其它算法问题刷题 ...

最新文章

  1. 内核启动流程分析(四)源码浅析
  2. Angular 应用的Support package
  3. linux 版本的scipy,Linux 系统中 SciPy (Python 3) 编程环境
  4. 汇编语言start标号的作用
  5. Acwing1069. 凸多边形的划分
  6. 读书随笔:The Book of Why——CHAPTER 3:From Evidence to Causes: Reverend Bayes Meets Mr. Holmes
  7. RISC-V MCU 智能语音物联网家居控制系统
  8. 超简单 Python 汉字拼音转换工具
  9. 极域电子书包教师端程序启动介绍
  10. 【cs230】吴恩达Deep Learning-3/3
  11. java架构师培训-成为java架构师的标准是什么
  12. 1分钟反勾稽金蝶销售出库,财务开心啦,一条语句简单实用,直接替换,执行即可。...
  13. PHP快手直播弹幕采集,获取斗鱼弹幕php版(原创)
  14. PHP:安装fileinfo扩展
  15. zj-layout组件的布局
  16. No URLs will be polled as dynamic configuration sources警告处理
  17. 阿里云OSS PicGo 配置图床教程 超详细
  18. java加减_Java位运算实现加减乘除
  19. MSDN网站新版亮相
  20. 苹果手机支持鸿蒙,全球第三大手机系统「鸿蒙」上线,这19款能抢先用…

热门文章

  1. python逐行写入文件_python逐行读写txt文件的实例讲解
  2. Java 1.2.3 文件输入与输出
  3. ~~朴素版prim算法
  4. R every day !
  5. 【转】Java 项目UML反向工程转化工具
  6. 突击计划——给定三角形边长,求面积
  7. Eclipse单行和多行注释快捷键以及撤销注释
  8. LeetCode 340. 至多包含 K 个不同字符的最长子串
  9. 点击startup.bat启动tomcat出现乱码
  10. 20165204 Java第六周学习