【题目】:
给你 2 枚相同 的鸡蛋,和一栋从第 1 层到第 n 层共有 n 层楼的建筑。

已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都 会碎 ,从 f 楼层或比它低 的楼层落下的鸡蛋都 不会碎 。

每次操作,你可以取一枚 没有碎 的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。

请你计算并返回要确定 f 确切的值 的 最小操作次数 是多少?

示例 1:

输入:n = 2
输出:2
解释:我们可以将第一枚鸡蛋从 1 楼扔下,然后将第二枚从 2 楼扔下。
如果第一枚鸡蛋碎了,可知 f = 0;
如果第二枚鸡蛋碎了,但第一枚没碎,可知 f = 1;
否则,当两个鸡蛋都没碎时,可知 f = 2。
示例 2:

输入:n = 100
输出:14

【解题】:

  • 利用动态规划解题。dp[i][j]表示剩下i+1个鸡蛋,从j楼扔下能确定f的最小操作数。

  • 当只有一个鸡蛋时,需要从第一层开始扔鸡蛋测试。假如我不这么做,而是从第二层开始扔的话,鸡蛋碎了我也不知道是从第几层开始的。所以dp数组初始化确定了dp[0][j]。
    解法一:动态规划
    本题比较直观的解法可以采用动态规划,用 dp[i][j] 表示有 i + 1 枚鸡蛋时,验证 j 层楼需要的最少操作次数, 我们可以分开分析 i = 0 和 i = 1 的情况:

  • i = 0 即只剩一枚鸡蛋,此时我们需要从 1 层开始逐层验证才能确保获取确切的 f 值,因此对于任意的 j 都有 dp[0][j] = j。考虑扔一次并不知道当前有没有碎,所以要取最差情况,逐一层测试。

  • i = 1,对于任意 j ,第一次操作可以选择在 [1, j] 范围内的任一楼层 k,如果鸡蛋在 k 层丢下后破碎,接下来问题转化成 i = 0 时验证 k - 1 层需要的次数,即 dp[0][k - 1], 总操作次数为 dp[0][k - 1] + 1,这里的+1意思是用第一枚鸡蛋去试也算一次操作; 如果鸡蛋在 k 层丢下后没碎,接下来问题转化成 i = 1 时验证 j - k 层需要的次数, 即 dp[1][j - k], 总操作次数为 dp[1][j - k] + 1,考虑最坏的情况,不知道当前扔一个鸡蛋碎还是没碎,所以两者取最大值则有Y=max(dp[0][k - 1] + 1, dp[1][j - k] + 1)。

  • 当每一层进行操作时,都会有一个操作数的值。那就取每次操作数与之前的最小值进行比较,保证取到所有楼层里的最小值。 dp[1][j] = min(dp[1][j],Y)

class Solution {
public:int twoEggDrop(int n) {vector<vector<int>> dp(2, vector<int>(n + 1, INT_MAX));dp[0][0] = dp[1][0] = 0;for (int j = 1; j <= n; ++j) {dp[0][j] = j;}for (int j = 1; j <= n; ++j) {for (int k = 1; k <= j; ++k) {dp[1][j] = min(dp[1][j], max(dp[0][k - 1] + 1, dp[1][j - k] + 1));}}return dp[1][n];}
};

【数据结构与算法】动态规划-leetcode.1884 鸡蛋掉落两枚鸡蛋相关推荐

  1. 力扣1884. 鸡蛋掉落-两枚鸡蛋

    力扣地址 1884. 鸡蛋掉落-两枚鸡蛋 难度中等28 给你 2 枚相同 的鸡蛋,和一栋从第 1 层到第 n 层共有 n 层楼的建筑. 已知存在楼层 f ,满足 0 <= f <= n , ...

  2. leetcode 1884-鸡蛋掉落-两枚鸡蛋

    给你 2 枚相同 的鸡蛋,和一栋从第 1 层到第 n 层共有 n 层楼的建筑. 已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都 会碎 ,从 f 楼 ...

  3. [数据结构与算法]动态规划:扔鸡蛋问题

    参考链接:https://gitee.com/lambertcao/fucking-algorithm/blob/master/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92 ...

  4. C++数据结构与算法 动态规划

    动态规划: 和贪婪算法一样,动态规划对一个问题的解是一系列的决策过程,贪婪算法依据贪婪准则,做出的每一个抉择都是不可撤回的,在动态规划中,需要考察一系列抉择,已确定一个最优抉择序列是否包含一个最优抉择 ...

  5. Python数据结构与算法-动态规划(钢条切割问题)

    一.动态规划(DP)介绍 1.从斐波那契数列看动态规划 (1)问题 斐波那契数列递推式: 练习:使用递归和非递归的方法来求解斐波那契数列的第n项 (2)递归方法的代码实现 import time # ...

  6. 数据结构与算法-动态规划

    题目描述: 1.一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 2.一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的 ...

  7. 数据结构与算法——动态规划思想解题三角形问题

    动态规划的基本思想 动态规划解题的时候将问题分解为几个不同的阶段(把原始问题分解为不同的子问题),自底向上计算.每次决策都依赖于当前的状态.我们可以将不同阶段的不同状态存储在一个二维数组中. 从这个二 ...

  8. 【数据结构与算法】LeetCode面试真题,带你领略算法思想

  9. 数据结构与算法--动态规划资源

    爬楼梯:http://www.sohu.com/a/149075950_684445 01背包问题:https://juejin.im/post/5affed3951882567161ad511

最新文章

  1. android应用课程设计报告,基于Android的多媒体播放器课程设计报告.doc
  2. Oracle高级查询之OVER (PARTITION BY ..)
  3. STM32开发 -- 继电器测试
  4. ARSessionConfiguration报错问题
  5. 如何节省1T图片带宽?解密极致图像压缩!
  6. 云原生应用程序运行时 Kyma 简介
  7. 只读副本和Spring Data第4部分:配置只读存储库
  8. 【模式识别】Fisher线性判别实验报告之MATLAB仿真
  9. redis慢查询日志,php安装redis扩展,redis存储session,redis主从配置
  10. 爬虫—分析Ajax爬取今日头条图片
  11. 【git】从零开始在git上部署自己的免费生日祝福网页
  12. 缠中说缠,最好用的缠论画笔和中枢的指标公式 通达信用
  13. 配电室环境监测系统,智能配电室环境监控系统完整方案
  14. 微信 小程序 python 渲染_微信小程序python用户认证的实现
  15. HTML中属性问题以及通信问题总结
  16. 基于stm32单片机的台历日历计时器万年历Proteus仿真(源码+仿真+全套资料)
  17. Imagewarping变形算法研究---MLSR(Nonrigid image deformation using moving regularized least quares)
  18. Linux操作系统概述
  19. 重大利好消息!有PMP和NPDP证书的同学看过来!
  20. wireshark数据包流量分析

热门文章

  1. windows10系统下蓝牙自动断开的问题
  2. 小米微信无法连接到服务器1-10087,微信无法连接到服务器【搞定方向】
  3. sql将日期格式化特定的字符串格式
  4. 金簿财务软件智能版3.985
  5. 如何让文字下划线border-bottom和文字的长度一致
  6. Adobe BrowserLab开放注册并发布升级
  7. 打印俄文字母表java,俄语字母与英语字母对照表
  8. 神经网络模型量化论文小结
  9. Buffon投针实验:究竟为什么是pi?
  10. Duplicate entry ‘XXX‘ for key ‘XXX.PRIMARY‘解决方案。