动态规划 | 鸡蛋问题 | 元旦假期来点“蛋”题

文章目录

    • 鸡蛋掉落 - 两枚鸡蛋
      • 题目描述
      • 动态规划解法
        • 问题分析
        • 程序代码
    • 鸡蛋掉落
      • 题目描述
      • 问题分析
      • 程序代码
      • 复杂度分析

鸡蛋掉落 - 两枚鸡蛋

题目描述

原题链接

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

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

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

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

动态规划解法

问题分析

状态定义dp[i][j]表示总共有 i 层楼,现在手上有 j + 1 个鸡蛋。

状态计算dp[i][1] = min(dp[i][1], max(j, dp[i - j][1] + 1))

我们假设总共有 i 层楼,从第 j 层楼往下扔第一个鸡蛋,有两种情况:

  1. 鸡蛋碎了,那么说明f楼层一定小于j,即在第 j 层的楼下。此时的最少操作次数为j - 1 + 1 = j
  2. 鸡蛋没碎,那么说明f楼层一定大于j,即在第 j 层的楼上。接下来,我们仍然持有 2 个鸡蛋,但此时考虑的楼层数只有i - j层。此时最少操作次数为dp[i - j][1] + 1

最终从第 j 层往下扔第一个鸡蛋,所需的最少操作次数为max(j, dp[i - j][1] + 1)

我们要做的就是遍历所有可能的情况j,找到所需操作次数最小的情况。

初始化dp[i][0] = dp[i][1] = i

  • 如果手上只有 1 个鸡蛋,i 层楼至少需要操作 i 次。
  • 如果手上有 2 个鸡蛋,i 层楼的最少操作次数不超过 i 次。
程序代码
class Solution {
public:int twoEggDrop(int n) {vector<vector<int>> dp(n + 1, vector<int>(2, 0));// 初始化for(int i = 1; i <= n; i++) {dp[i][0] = i;dp[i][1] = i;}for(int i = 2; i <= n; i++) {for(int j = 1; j < i; j++) {dp[i][1] = min(dp[i][1], max(j, dp[i - j][1] + 1));}}return dp[n][1];}
};

观察上述代码,可以发现代码可以压缩成一维:

class Solution {
public:int twoEggDrop(int n) {vector<int> dp(n + 1);// 初始化for(int i = 1; i <= n; i++) {dp[i] = i;}for(int i = 2; i <= n; i++) {for(int j = 1; j < i; j++) {dp[i] = min(dp[i], max(j, dp[i - j] + 1));}}return dp[n];}
};

鸡蛋掉落

题目描述

原题链接

给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。

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

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

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

问题分析

如果套用上一题的分析思路,我们可以定义如下状态以及状态计算。

状态定义dp[i][j]表示总共有 i 层楼,现在手上有 j + 1 个鸡蛋。

状态计算dp[i][k] = min(dp[i][k], max(dp[j-1][k-1] + 1, dp[i - j][k] + 1)),其中k表示手上有k + 1个鸡蛋,从第 j 层开始扔鸡蛋。

但是该方法最终会 TLE

我们观察上述的状态转移方程,若我们固定鸡蛋的个数k + 1,可以发现,随着楼层数i的增加,dp[j-1][k-1] + 1这一项不会发生变动,即从第 j 层丢下的鸡蛋碎了。而dp[i - j][k] + 1这一项会随着楼层数i的增加而增加,即从第 j 层丢下的鸡蛋没碎。

接下来我们观察从第 j 层开始丢鸡蛋,随着j的增加,dp[j-1][k-1] + 1会逐渐增加,而dp[i - j][k] + 1会逐渐减小。而二者的交点位置就是dp[i][k]的最小值。

随着楼层数i的不断增加,dp[i - j][k] + 1不断上移动,而二者的交点也不断向右上方移动。

在这里插入图片描述

因此,当我们固定鸡蛋个数k+1时,随着楼层数i的不断增加,dp[i][j]最优解j的坐标也单调递增。

程序代码

class Solution {
public:int superEggDrop(int k, int n) {vector<int> dp(n + 1);// 初始化for(int i = 1; i <= n; i++) {dp[i] = i;}// 先固定鸡蛋个数for(int j = 2; j <= k; j++) {vector<int> f(n + 1);  // 存储从第x层丢下的鸡蛋没碎的历史最值int x = 1;  // 从第x楼开始抛f[0] = 0;// 总楼层数for(int i = 1; i <= n; i++) {while(x < i && max(dp[x-1], f[i - x]) >= max(dp[x], f[i - x -1])) {x++;}f[i] = 1 + max(dp[x-1], f[i - x]);}for(int i = 1; i <= n; i++) {dp[i] = f[i];}}return dp[n];}
};

复杂度分析

时间复杂度为 O ( k n ) O(kn) O(kn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的学习C#回炉学习日志——Lua热更新06_模块

模块 个人理解&#xff1a;lua的包比起C#&#xff0c;基本上就是一个table记录所有信息&#xff0c;包括变量、常量等 module {} module.constant "一个常量" function module.func1()io.write("一个共有函数\n") endlocal function func2()-- bodypr…

C语言注释的使用与理解

什么是注释&#xff1f; 在编程中&#xff0c;注释&#xff08;Comment&#xff09;是一种非执行文本&#xff0c;它用于为代码提供解释、说明和文档。注释的内容不参与程序的实际编译和运行过程&#xff0c;其主要目的是提高代码的可读性和可维护性&#xff0c;方便开发者以及…

MySQL:排序和分组

1、排序 order by 用于对结果集按照一个列或者多个列进行排序。默认按照升序对记录进行排序&#xff0c;如果需要按照降序对记录进行排序&#xff0c;可以使用 desc 关键字。 order by 对多列排序的时候&#xff0c;先排序的列放前面&#xff0c;后排序的列放后面。并且&…

Python字典类型key找value或者value找key方法汇总

字典中&#xff0c;如何通过唯一的value获取key 如果传入的值在字典的值中不存在&#xff0c;可以返回一个特定的默认值或者抛出一个异常来表示该情况。以下是两种处理方式的示例&#xff1a; 返回默认值&#xff1a; def get_key_by_value(dictionary, value, defaultNone)…

JavaScript:函数隐含对象arguments/剩余参数. . .c/解构赋值

除了this&#xff0c;在函数内部还存在着一个隐含的参数arguments arguments 是一个类数组对象&#xff08;伪数组&#xff09; 调用函数时传递的所有实参&#xff0c;都被存储在arguments中 arguments[0] 表示的是第一个实参 arguments[1] 表示的是第二个实参 以此类推..…

2022年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员&#xff0c;包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系&#xff0c;让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例&#xff0c;也能与国内顶尖的技术专家…

【数据结构】链式家族的成员——循环链表与静态链表

循环链表与静态链表 导言一、循环链表1.1 循环单链表1.2 循环双链表 二、静态链表2.1 静态链表的创建2.2 静态链表的初始化2.3 小结 结语 导言 大家好&#xff01;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 经过前面的介绍&#xff0c;相信大家对链式家族的…

软件测试/测试开发丨Mac Appium环境搭建

Mac 上 Appium 环境搭建 安装 nodejs 与 npm 安装方式与 windows 类似 &#xff0c;官网下载对应的 mac 版本的安装包&#xff0c;双击即可安装&#xff0c;无须配置环境变量。官方下载地址&#xff1a;https://nodejs.org/en/download/ 安装 appium Appium 分为两个版本&a…

【Transformer】深入理解Transformer模型1——初步认识了解

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

ElasticSearch--基本操作

ElasticSearch 完成ES安装 http://101.42.93.208:5601/app/dev_tools#/console 库的操作 创建索引库 请求方式&#xff1a;PUT 请求路径&#xff1a;/索引库名&#xff0c;可以自定义 请求参数&#xff1a;mapping映射 PUT /test {"mappings": {"propertie…

计算机硬件 4.3显示器

第三节 显示器 一、基本概念 1.定义&#xff1a;将电信号转换为可以直接看到的图像的最基本输出设备。 2.分类&#xff1a;按显示色彩分&#xff1a;单色显示器、彩色显示器。 按显示原理分&#xff1a;CRT显示器、LCD显示器、LED显示器、OLED显示器。 3.原理结构&#xff…

【Oracle】 Oracle Sequence 性能优化

Sequence是很简单的&#xff0c;如果最大程度利用默认值的话&#xff0c;我们只需要定义sequence对象的名字即可。在序列Sequence对象的定义中&#xff0c;Cache是一个可选择的参数。默认的Sequence对象是有cache选项的&#xff0c;默认取值为20。这个默认值对于大多数情况下都…

云原生|kubernetes|kubernetes资源备份和集群迁移神器velero的部署和使用

前言&#xff1a; kubernetes集群需要灾备吗&#xff1f;kubernetes需要迁移吗&#xff1f; 答案肯定是需要的 那么&#xff0c;如何做kubernetes灾备和迁移呢&#xff1f;当然了&#xff0c;有很多的方法&#xff0c;例如&#xff0c;自己编写shell脚本&#xff0c;或者使用…

2023年江苏省职业院校技能大赛高职组“软件测试”赛项接口测试答案报告(含术语)

2023年江苏省职业院校技能大赛高职组“软件测试”赛项接口测试答案报告 接口测试要求: 1、执行接口测试 本部分按照软件接口测试文档要求,执行接口测试;使用接口测试工具PostMan,编写脚本、配置参数、执行接口测试并且截图。截图需粘贴在接口测试总结报告中。接口测试具体…

06-C++ 模板

模板、类型转换 模板 1. 简介 一种用于实现 通用编程 的机制。 将 数据类型 可以作为参数进行传递 。 通过使用模板&#xff0c;我们可以编写可复用的代码&#xff0c;可以适用于多种数据类型。 c模板的语法使用尖括号 < > 来表示泛型类型&#xff0c;并使用关键字…

啊?这也算事务?!

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

Java中的Optional类使用技巧

在Java中&#xff0c;Optional 是一个可以为null的容器对象。如果值存在则isPresent()方法返回true&#xff0c;调用get()方法会返回该对象。 使用Optional可以有效地防止NullPointerException。 下面是一些使用Optional的技巧&#xff1a; 创建Optional对象&#xff1a; Opt…

php-m和phpinfo之间不一致的问题的可能原因和解决办法

1.不同的 PHP配置文件: php -m 和 phpinfo 可能会使用不同的 PHP 配置文件。确保它们都使用相同的配置文件。你可以在命令行中使用 php --ini 来查找当前使用的配置文件位置&#xff0c;并在 phpinfo 中查看 Loaded Configuration File 来确保它们相同。 2.不同的 PHP 版本:确…

uni-app封装表格组件

组件代码&#xff1a; <template><view><uni-table class"tableBox" border stripe emptyText""><!-- 表头行 --><uni-tr class"tableTr"><uni-th :sortable"item.sortable" :class"item.sort…

【人工智能新闻】2023年人工智能热门新闻

欢迎收看我们的特别版时事通讯&#xff0c;重点报道“2023年人工智能热门新闻”今年是人工智能领域的里程碑&#xff0c;展示了重塑技术和我们日常生活的突破性进步和创新。从大型企业投资到革命性的技术发布&#xff0c;2023年的每个月都带来了非凡的成就。 加入我们&#xf…