leetcode887

题意:用k个蛋测试n层楼的f值,求最坏情况(所有蛋碎蛋不碎的情况中)的最小测试次数。f值表示在f及以下层蛋扔下去都不会碎,之上都会碎。

一、一个蛋的情况
只能从1楼逐层往上尝试,结果为楼层数。
二、2个蛋的情况(谷歌面试题的形式)

100层楼为例:
将楼层分为10等分,1,10,20,30…100
A操作是测试1, 10, 20, 30… 100 扔下,蛋是否会碎掉
B操作是从x1,x2,x3…x9逐层测试蛋是否碎

当A操作不碎,一直进行A;
当A操作在碎掉,就在之前的9层逐层尝试;
故最坏情况是100层碎掉,逐层尝试91…99
19次(10次A,9次B操作)。

三、 无穷个蛋
蛋就不需要考虑了,结果就是楼层数的二分。

四、一般情况,n层楼,k个蛋

dp[n][k] : n层楼k个鸡蛋最坏情况能得到f值的最小尝试次数
由上面讨论知:
dp[1][k] = 1
dp[n][1] = n

对于1-N层楼的任意K点
若K处鸡蛋碎了,则问题转化为dp[K-1][j-1];
若K处鸡蛋没碎,则转化为求dp[N-K][j] .
因为要最坏情况,所以取最大值,再+1(K点的尝试次数)。

因为蛋碎不碎是不可控的,所以要取max,而K的点却是可以控制的(枚举到的位置是确定的),故取min。

由于K点是任意的,故要枚举K点位置
时间复杂度O(n * n * k)

 //O(n*n*k)int superEggDrop(int k, int n) {// dp[i][j] : i层楼j个鸡蛋最坏情况能得到f值的最小尝试次数vector<vector<int>>dp(n+1, vector<int>(k+1, 0));for(int j = 1; j <= k; ++j) dp[1][j] = 1;for(int i = 1; i <= n; ++i) dp[i][1] = i;for(int i = 2; i <= n; ++i) {for(int j = 2; j <= k; ++j) {dp[i][j] = dp[i][j-1];for(int K = 1; K <= i; ++K) {dp[i][j] = min(dp[i][j], max(dp[K-1][j-1], dp[i-K][j]) + 1);}}}return dp[n][k];}

思路二:
dp[i][i] : j个鸡蛋做i次尝试最多能在dp[i][j]层楼中得到f

dp[i][j] = dp[i-1][j-1] + dp[i-1][j] + 1
(尝试一次之后(1)+ 尝试i-1次楼层下面最高的楼层+ 上面最高能达到的楼层)
时间复杂度O(n*k)

    int superEggDrop(int k, int n) {// dp[i][j] : j个鸡蛋做i次尝试最多能在dp[i][j]层楼中得到f// dp[i][j] = dp[i-1][j-1] + dp[i-1][j] + 1vector<vector<int>>dp(n+1, vector<int>(k+1, 0));for(int i = 1; i <= n; ++i) {for(int j = 1; j <= k; ++j) {dp[i][j] = dp[i-1][j-1] + dp[i-1][j] + 1;}if(dp[i][k] >= n) return i;}return n;}

Reference:
李永乐老师讲解双蛋问题
AcWing

leetcode887. 鸡蛋掉落 谷歌经典面试题的一般情况相关推荐

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

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

  2. LeetCode887. 鸡蛋掉落

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

  3. leetcode887 鸡蛋掉落

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

  4. leetcode:887. 鸡蛋掉落【经典dp定义】

    目录 题目截图 题目分析 ac code 总结 题目截图 题目分析 变量:鸡蛋的数量,楼层n,尝试的次数m 有一个单调性容易发现:尝试的次数越多,能解决楼层越高的确切值 另一个单调性:鸡蛋的数量越多, ...

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

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

  6. 谷歌公司经典面试题扔鸡蛋的详细解读(一)

    文章目录 题目:扔鸡蛋问题 方法一: 方法二: 方法三: 方法三进阶:假设法 总结: 首先说一下大概的题目 题目:扔鸡蛋问题 有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度.比如鸡蛋在第9层没 ...

  7. 谷歌公司经典面试题扔鸡蛋的详细解读—动态规划(二)

    首先要说的是到底啥是动态规划? 那么,怎样找到状态转移方程式呢? 状态转移方程式有了,如何计算出这个方程式的结果呢? 代码如何实现? 如何优化呢? --------------– 上一篇博客中咦非常通 ...

  8. 经典面试题扔鸡蛋(Google面试题附带LeetCode例题)

    该题由于太过于经典,现在已经不是Google的面试题了 思路讲解 大家可能存在的疑问解答 例题:LeetCode 887 鸡蛋掉落 PS:(蓝桥杯摔手机就是根据扔鸡蛋过来的) 思路讲解 你有两个鸡蛋, ...

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

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

最新文章

  1. HDU1426 Sudoku Killer DFS
  2. java获取接口数据类型_java中调用第三方接口获取数据的方式
  3. python variable_PyTorch中的Variable变量详解
  4. Excel制作随机抽取名单
  5. 条码生成 SDK - Zint 教程及示例
  6. Python编程(思维导图)
  7. ZOJ 3987 2017CCPC秦皇岛 G:Numbers(高精度+贪心)
  8. 什么是restful api
  9. Second kill system learning
  10. 列表套字典三者匹配对应关系
  11. CSS选择符(选择器)基础认识
  12. docker配置国内加速器的两种方法
  13. wd移动硬盘不能识别_wd移动硬盘无法识别
  14. nvidia-docker的安装
  15. hdu 5238 Calculator(线段树+中国剩余定理)
  16. tracert使用与现象排查
  17. 设置周一,判断周一 JS
  18. 快手AI实验室Y-tech招聘暑期算法实习生
  19. meego linux版本,记MeeGo的多系统启动
  20. 小米在英国的1英镑闪购活动凸显其不熟悉欧洲市场

热门文章

  1. 程序员不是砌砖工人,他们是作家
  2. 用python操控手机刷视频,自动刷金币
  3. Qt QSS常用样式总结
  4. Go Windows上生成适用于 Linux 的可执行文件
  5. 任正非:年终奖制度是最落后的制度 我坚决反对
  6. c语言请你为儿童专门设计定制一款专门测试算术能力的软件,莆田学院《C语言程序设计》模拟试卷-03-.doc...
  7. 台式计算机屏幕亮度在哪调,台式电脑怎么调节亮度_台式电脑的亮度在哪里设置...
  8. 丹青携手日本奇幻大师梦枕貘先生推出巨著《暗狩之师》中文版
  9. ecshop二次开发手册,ECSHOP文件结构,ECSHOP目录详解
  10. 娱乐机器人行业:兴于教育,困于教育