LeetCode 1105. Filling Bookcase Shelves【记忆化搜索,动态规划】中等

news2024/11/17 7:42:42

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给定一个数组 books ,其中 books[i] = [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。

按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。

先选几本书放在书架上(它们的厚度之和小于等于书架的宽度 shelfWidth ),然后再建一层书架。重复这个过程,直到把所有的书都放在书架上。

需要注意的是,在上述过程的每个步骤中,摆放书的顺序与你整理好的顺序相同

  • 例如,如果这里有 5 本书,那么可能的一种摆放情况是:第一和第二本书放在第一层书架上,第三本书放在第二层书架上,第四和第五本书放在最后一层书架上。

每一层所摆放的书的最大高度就是这一层书架的层高,书架整体的高度为各层高之和。以这种方式布置书架,返回书架整体可能的最小高度。

示例 1:

输入:books = [[1,1],[2,3],[2,3],[1,1],[1,1],[1,1],[1,2]], shelfWidth = 4
输出:6
解释:
3 层书架的高度和为 1 + 3 + 2 = 6 。
第 2 本书不必放在第一层书架上。

示例 2:

输入: books = [[1,3],[2,4],[3,2]], shelfWidth = 6
输出: 4

提示:

  • 1 <= books.length <= 1000
  • 1 <= thicknessi <= shelfWidth <= 1000
  • 1 <= heighti <= 1000

解法1 记忆化搜索

对于 books = [[1,1],[2,3],[2,3],[1,1],[1,1],[1,1],[1,2]], shelfWidth = 4 ,第一层放的书可以是 [[1,1] 、或者 [[1,1],[2,3]] ,只要这层书的厚度不超过 shelfWidth 即可。

去掉这段放置完成的书,例如去掉 [[1,1],[2,3]] 后,剩下要解决的问题就是「求出放置 books = [[2,3],[1,1],[1,1],[1,1],[1,2]], shelfWidth = 4 所需的书架最小高度」。这是一个和原问题相似的子问题,所以可以用递归解决

根据上面的讨论,递归参数只需要一个 idfs(i) 表示放置 books[i:n-1] 这些书所需的书架最小高度。假设这一层放置的最后一本书在 books 中的下标是 j(总体厚度不能超过 shelfWidth ),那么这一层书架的高度为 max ⁡ k = i j { b o o k s [ k ] [ 1 ] } \max_{k=i}^{j} \bigg\{ books[k][1]\bigg\} k=imaxj{books[k][1]}
考虑「这一层放置的最后一本书」的不同下标 j j j ,这层书架的高度也不同,而书架总体的最小高度即为「这层书架的高度 + d f s ( j + 1 ) dfs(j + 1) dfs(j+1) 」的最小值,即:
d f s ( i ) = min ⁡ { max ⁡ k = i j { b o o k s [ k ] [ 1 ] } + d f s ( j + 1 ) } dfs(i) = \min \Bigg\{ \max_{k=i}^{j} \bigg\{ books[k][1]\bigg\} + dfs(j + 1)\Bigg\} dfs(i)=min{k=imaxj{books[k][1]}+dfs(j+1)}

  • 递归边界: d f s ( n ) = 0 dfs(n) = 0 dfs(n)=0 。此时不用放置任何书,书架高度为 0 0 0
  • 递归入口: d f s ( 0 ) dfs(0) dfs(0) ,就是答案。

当然,整个递归中有大量重复递归调用(递归入参相同),由于递归函数没有副作用,同样的入参无论计算多少次,算出来的结果都是一样的,因此可以用记忆化搜索来优化

class Solution {
public:
    int minHeightShelves(vector<vector<int>>& books, int shelfWidth) { 
        int n = books.size(), dp[1010];
        int inf = 0x3f3f3f3f;
        memset(dp, 0x3f, sizeof(dp));
        function<int(int)> dfs = [&](int i) -> int { // 从i开始顺序摆放书,得到的最小书架高度
            if (i >= n) return 0; // 没有书
            if (dp[i] != inf) return dp[i]; // 已有记录
            int sumw = 0, th = 0;
            for (int j = i; j < n; ++j) {
                sumw += books[j][0]; // 厚度
                if (sumw > shelfWidth) break;
                th = max(th, books[j][1]); // 高度 // 可以放在同层
                dp[i] = min(dp[i], th + dfs(j + 1));
            }
            return dp[i];
        };
        return dfs(0);
    }
};

解法2 动态规划

将上述记忆化搜索写成递推形式即可:

class Solution {
public:
    int minHeightShelves(vector<vector<int>>& books, int shelfWidth) { 
        int n = books.size(), dp[1010];
        int inf = 0x3f3f3f3f;
        memset(dp, 0x3f, sizeof(dp));
        dp[n] = 0;
        for (int i = n - 1; i >= 0; --i) {
            int sumw = 0, th = 0;
            for (int j = i; j < n; ++j) { 
                sumw += books[j][0]; // 厚度
                if (sumw > shelfWidth) break;
                th = max(th, books[j][1]); // 高度 // 可以放在同层
                dp[i] = min(dp[i], th + dp[j + 1]);
            }
        }
        return dp[0];
    }
};

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

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

相关文章

甘特图控件DHTMLX Gantt入门使用教程【引入】:dhtmlxGantt与ASP.NET Core(下)

DHTMLX Gantt 是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&a…

从Pandas快速切换到Polars :数据的ETL和查询

对于我们日常的数据清理、预处理和分析方面的大多数任务&#xff0c;Pandas已经绰绰有余。但是当数据量变得非常大时&#xff0c;它的性能开始下降。 我们以前的两篇文章来测试Pandas 1.5.3、polar和Pandas 2.0.0之间的性能了&#xff0c;Polars 正好可以解决大数据量是处理的…

电影《忠犬八公》观后感

上周看了电影《忠犬八公》&#xff0c;整部电影是以一条狗为故事线演绎的&#xff0c;之前看电影《忠犬帕尔玛》的时候&#xff0c;同事就推荐了《忠犬八公》&#xff0c;以为说的是同一部电影&#xff0c;去维基百科查过才知道&#xff0c;中国版的冯小刚为主演的《忠犬八公》…

全景丨0基础学习VR全景制作,平台篇第五章:开场封面功能

大家好欢迎观看蛙色平台使用教程 开场封面功能&#xff0c;现已支持开场图片和开场视频两种呈现方式&#xff0c; 分别针对PC端和移动设备访问分别设置呈现图片、视频内容&#xff0c;满足市场主流需求。 开场图片 传达主旨 1、全局-开场封面-图片 2、分别对PC端和移动设备访…

手动构建自己的docker容器镜像实战

前言 之前的实战中&#xff0c;我们实战中&#xff0c;我们使用的镜像都是镜像仓库已有的镜像。 已有的镜像都是别人已经开发好上传的。今天我们一起来看看如何构建自己的镜像并上传到镜像仓库中。 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&…

[计算机图形学]光线追踪前瞻:阴影图(前瞻预习/复习回顾)

一、前言 我们前面学习过了光栅化&#xff0c;而光栅化会有一系列问题&#xff0c;比如&#xff1a;全局的光线传输&#xff0c;阴影。我们之前讲着色的时候说了&#xff0c;我们认为着色是一个局部的操作&#xff0c;我们只考虑着色点本身&#xff0c;并不考虑其它物体的遮挡对…

3Dconnexion SpaceMouse Enterprise 企业版有线3D鼠标

3Dconnexion SpaceMouse Enterprise 企业版有线3D鼠标 企业版有线3D鼠标SpaceMouse Enterprise凭借六自由度&#xff08;6DoF&#xff09;传感器&#xff0c;以及标准和自定义快速视图的一键访问功能&#xff0c;你可以比以往更加轻松自如地查看3D模型。轻轻操纵控制帽即可流畅…

表白墙 - 进阶(MySQL版本) - 持久化存储

想要解决上面那个版本存在的问题&#xff1a;服务器重启&#xff0c;数据不丢失。 最好的办法&#xff1a;将数据存储到硬盘上。 存储的方式&#xff1a; 1、直接使用 流对象 写入文本文件 2、借助数据库 我们采取的方式&#xff1a;是 MySQL 数据库的方式 来实现 持久化存储。…

Python卷积详解

文章目录 卷积函数对比测试卷积应用 卷积函数 python提供了多种卷积方案&#xff0c;相比之下&#xff0c;定义在ndimage中的卷积函数&#xff0c;在功能上比numpy和signal中的卷积要稍微复杂一些&#xff0c;这点仅从输入参数的多少就可略窥一二 numpy.convolve(a, v, modef…

拥抱汽车行业新时代,移远通信着力打造“七大产品技术生态”

汽车市场和消费者的需求正在发生日新月异的变化。以往中国新能源汽车的推广&#xff0c;大多倚重政策补贴&#xff0c;而如今新能源汽车已经走过了这个阶段&#xff0c;开始变成消费者自愿选择。除了汽车的电动化&#xff0c;“智能化”是不少车型拨动消费者心弦的另一主要因素…

光学仿真小作品集

光学仿真小作品集 传播方向与 z 轴平行的二维平面波自由空间中的传输传播方向与 z 轴有一定夹角的二维平面波自由空间中的传输 本文将展示一些作者本人平时自制的光学仿真小作品。 传播方向与 z 轴平行的二维平面波自由空间中的传输 传播方向与 z 轴有一定夹角的二维平面波自由…

(九)【软件设计师】计算机系统-浮点数习题

文章目录 一、2009年下半年第3、4题二、2011年上半年第5题三、2012年下半年第3题四、2015年上半年第1题五、2015年下半年第3题六、2016年下半年第3题七、2018年上半年第1题八、2020年下半年第3题 知识点回顾 &#xff08;八&#xff09;【软件设计师】计算机系统—浮点数 一、…

怎么使用AS推送项目到Github上,一文解决!

废话不多说&#xff0c;直接发车了&#xff01;在android studio上推送项目到GitHub上有个基本可以解决所有推送失败问题的步骤&#xff0c;如下图&#xff1a; 路径&#xff1a;File —— Setting —— Version Control —— GitHub —— 加号&#xff0c;添加用户 上述步骤是…

河道船舶识别检测系统 python

河道船舶识别检测系统通过ppythonYOLOv5网络模型算法技术&#xff0c;河道船舶识别检测系统对画面中的船只进行7*24小时实时监测&#xff0c;若发现存在进行违规采砂或者捕鱼立即自动抓拍触发告警。与C / C等语言相比&#xff0c;Python速度较慢。也就是说&#xff0c;Python可…

mui.ajax

mui.ajax(http:xxxxxxxxxx/login,//请求的地址{data:{},//传给服务器的数据&#xff0c;一般在post请求中dataType:json,//服务器返回数据的格式&#xff1b;type:post,//HTTP请求类型&#xff1b;目前仅支持post/gettimeout:5000,//设置超时时间async:true,//是否异步&#xf…

应急照明和疏散指示系统在化工厂房中的设计与产品选型

【摘 要】《消防应急照明和疏散指示系统技术标准》(GB 51309-2018)的颁布&#xff0c;使应急照明和疏散指示的设计理念及设计方案发生了颠覆性的改变。化工企业在进行系统设计时也有其自身的特点及问题&#xff0c;现根据实际案例&#xff0c;解析化工企业应急照明和疏散指示系…

echrts 工程项目可视化

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、工程项目可视化二、…

记录-new Date() 我忍你很久了!

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 大家平时在开发的时候有没被new Date()折磨过&#xff1f;就是它的诸多怪异的设定让你每每用的时候&#xff0c;都可能不小心踩坑。造成程序意外出错&#xff0c;却一下子找不到问题出处&#xff0c;那…

受安全威胁困扰的时代的可见性和人工智能

安全漏洞和事件以惊人的规律性发生&#xff0c;媒体报道的大人物&#xff0c;只是发生的实际数量的一小部分。 就在上周&#xff0c;横跨澳大利亚和新西兰的主要金融服务提供商 Latitude Financial 公布了影响其 1400 万客户的网络攻击和数据泄露的详细信息。 如果我们要确保…

一致性框架设计方案

补充组件依赖 前言 对于供应链业务&#xff0c;一般对数据一致性要求高。且由于业务复杂&#xff0c;可能会存在一个业务功能触发几个异步操作的场景&#xff0c;且要保证相关操作同时触发或不触发。 为了降低技术设计难度、代码编写难度&#xff0c;特意设计最终一致性框架&a…