LC-1105. 填充书架(记忆化搜索 ==> 动态规划)

news2025/5/19 13:48:43

1105. 填充书架

难度中等169

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

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

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

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

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

每一层所摆放的书的最大高度就是这一层书架的层高,书架整体的高度为各层高之和。

以这种方式布置书架,返回书架整体可能的最小高度。

示例 1:

img

输入: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

记忆化搜索 ==> 递推

题解:https://leetcode.cn/problems/filling-bookcase-shelves/solution/jiao-ni-yi-bu-bu-si-kao-dong-tai-gui-hua-0vg6/

记忆化

class Solution {
    int[][] books;
    int[] cache;
    int shelfWidth;
    public int minHeightShelves(int[][] books, int shelfWidth) {
        this.books = books;
        this.shelfWidth = shelfWidth;
        // 举个例子,[把 books[n -1] 单独放一层,把 books[n - 2] 单独放1层和[把 books[n - 2] 和 books[n -1]放同一层] ,都会递归到dfs(n - 3)。
        // 一叶知秋,整个递归中有大量重复递归调用(递归入参相同
        cache = new int[books.length]; 
        Arrays.fill(cache, -1);
        return dfs(books.length - 1);
    }

    /**
        定义dfs(i) 表示把books[0]到books[i]按顺序摆放后的最小高度
        枚举最后一层的第一本书的下标j,那么从books[j]到books[i]的宽度之和不能超过shelfWidth
        状态转移方程:dfs(i) = min{dfs(j-1) + max(books[k][1])}, j <= k= i
        递归边界:dfs(-1) = 0,没有书,最小高度为0
        递归入口:dfs(n-1) 表示把书按顺序拜访后的最小高度 
     */
    public int dfs(int i){
        if(i < 0) return 0; // 没有书了, 高度为0
        if(cache[i] >= 0) return cache[i];
        int res = Integer.MAX_VALUE, maxH = 0,leftW = shelfWidth;
        for(int j = i; j >= 0; j--){
            leftW -= books[j][0];
            if(leftW < 0) break; // 空间不足,无法放书
            maxH = Math.max(books[j][1], maxH); // 从j到i的最大高度
            res = Math.min(res, dfs(j-1) + maxH);
        }
        return cache[i] = res;
    }
}

转成递推

class Solution {
    public int minHeightShelves(int[][] books, int shelfWidth) {
        int n = books.length;
        int[] f = new int[n+1];// 由于需要一个状态标识i<0,因此整体右移,最后答案返回f[n]
        f[0] = 0; // 初始值:没有书时最小高度为0 
        for(int i = 0; i < n; i++){
            f[i+1] = Integer.MAX_VALUE; // 初始高度无穷大(res,因为求最小高度)
            int maxH = 0, leftW = shelfWidth;
            for(int j = i; j >= 0; j--){
                leftW -= books[j][0];
                if(leftW < 0) break; // 空间不足,无法放书
                maxH = Math.max(maxH, books[j][1]); // 从 j 到 i 的最大高度
                f[i+1] = Math.min(f[i+1], f[j] + maxH);
            }
        }
        return f[n];
    }
}

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

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

相关文章

ajax写法和json的知识点

1. JQuery方式来实现AJAX 1.1 $.ajax()方式来实现AJAX 语法&#xff1a;$.ajax(url,[settings]);但是我们一般这么写$.ajax({键值对});。 $.ajax()来实现ajax的案例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"…

consul集群搭建教程 - 多机集群

简言 1. 使用consul单节点有宕机&#xff0c;数据丢失的风险&#xff0c;为了安全&#xff0c;使用consul集群更靠谱 2. consul的各个版本下载地址在 Consul Versions | HashiCorp Releases 3. 本文使用consul的版本是consul1.15.1&#xff0c;所以请下载名字为 consul_1.15…

GitHub开源神器,已获3k star!让你的 ChatGPT 不再报错!感受丝滑般体验!

点击上方“Github爱好者社区”&#xff0c;选择星标 回复“资料”&#xff0c;获取小编整理的一份资料 作者&#xff1a;GG哥 来源&#xff1a;GitHub爱好者社区&#xff08;github_shequ&#xff09; 这是GitHub爱好者社区第 71 篇原创文章 Hello&#xff0c;大家好&#xff0…

基于springboot的大学生租房系统源码论文数据库

3.1系统功能 现在无论是在PC上还是在手机上&#xff0c;相信全国所有地方都在进行大学生租房管理。随着经济的不断发展&#xff0c;系统管理也在不断增多&#xff0c;大学生租房系统就是其中一种&#xff0c;很多人会登录到相关的租房系统查看租房信息&#xff0c;还能查看房屋…

高效提升电池寿命和安全性 | 基于ACM32 MCU的BMS应用方案

电池管理系统&#xff08;BMS&#xff09;通过监控电池的状态&#xff0c;智能化管理及维护各个电池单元&#xff0c;从而防止电池出现过充电和过放电。优质的电池管理系统能够最大限度地延长电池整体使用寿命&#xff0c;有效保障设备安全。 BMS电池管理概述 BMS&#xff0c…

Linux使用Jenkins搭配Gitee自动化部署Vue项目

目录 一、环境准备二、Jenkins配置Node2.1 下载NodeJS插件2.2 配置node 三、新建任务-Vue项目四、配置Nginx 一、环境准备 Jenkins&#xff1a; Node&#xff1a;安装配置教程 建三个软链接&#xff0c;不然Jenkins会找不到 ln -s /usr/local/node-v14.18.2-linux-x64/bin/…

CDH 集成 Flink-1.14.3 过程与踩坑记录

一、资源准备与配置 1.1 项目文件下载与配置 #下载 flink-parcel 项目文件 [roothadoop105 ~]# git clone https://github.com/pkeropen/flink-parcel.git [roothadoop105 ~]# cd flink-parcel/ #编辑下载地址&#xff0c;看自己需求哪个版本 [roothadoop105 flink-parcel]# …

【后续】使用nvm替换nvmw作为nodejs的版本切换(亲测)

文接上篇&#xff0c;使用nvm替换nvmw作为nodejs的版本切换&#xff08;亲测&#xff09; 如图各种乱码&#xff0c;在vscoe中也是出现 真的好烦啊。看到提示的还是之前nvmw不能执行的各种报错。 XXX不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 决定&am…

【编译】JITAOT介绍与优劣

文章目录 JIT优劣 AOT优劣 二者区别来源 AOT 去年发布的 .NET 7 中引入了该功能&#xff0c;只是在 .NET 8 中进一步进行了改进。新版本中通过 Native AOT 发布的“Hello, World”应用程序体积进一步缩小&#xff0c;只有 .NET 7 的一半。 以 CoreCLR 为例&#xff0c;不做 AOT…

Linux进程信号(上)

目录 一&#xff1a;信号引入 二&#xff1a;信号保存方式 三&#xff1a;信号处理方式 四&#xff1a;查看Linux信号 五&#xff1a;信号捕捉 六&#xff1a;信号产生 一&#xff1a;终端按键产生信号 二&#xff1a;系统函数产生信号 2.1:kill&#xff08;&#xff…

安全测试:配置管理潜在威胁

一、配置管理威胁有哪些 明文信息传输漏洞敏感信息泄露默认或可猜解用户账户会话重放攻击测试验证码缺陷http方法测试 二、明文信息传输和存储漏洞 漏洞描述&#xff1a; 页面中没有对传输的用户名和密码等敏感信息进行加密后传输。用户密码后台存储是否加密。 产生原因&a…

MySQL安装版步骤

百度网盘有安装版、解压包安装包以及visual插件 链接&#xff1a;https://pan.baidu.com/s/1XXvWa40FYX5mtqofW_knIg 提取码&#xff1a;ky2q 下载地址https://downloads.mysql.com/archives/installer/ 双击下载好的exe文件&#xff0c;选择Custom自定义安装&#xff0c;点…

内联函数-取决于编译器

内联函数 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 内联函数完美解决了宏函数上述所以缺点&#xff0c;但是不是所有函数都要搞成内联函数&#…

CentOS7(一)安装和基础配置

文章目录 一、CentOs 7 下载与安装二、安装过程三、安装Ohmyzsh1、基础软件安装2、编辑 install.sh4、修改仓库地址5、修改shell6、编辑主题和插件7、刷新配置8、创建用户级别配置文件 四、研发环境配置四、centos不能访问github&#xff0c;速度慢五、防火墙相关六、wget 下载…

Scala中的Map 集合详解

目录 一、不可变长Map集合 1.map的声明与遍历 2.map的常用方法&#xff1a;get、getOrElse、keys、values、、&#xff1a; 二、可变长Map集合 三、Map的其他方法 key -> value 的语法形式实际上是用库中的隐式转换实现的&#xff0c;实际调用了 Map.apply 方法。Map.a…

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-…

我看谁没看过

vue在新窗口打开页面方法 const { href } this.$router.resolve({path: "/officePlatform/addPrompt"});window.open(href, "_blank"); 添加圆形标志 h3::before {content: "";display: inline-block;width: 13px;height: 13px;background: va…

易点易动设备管理平台帮助化工企业实现设备高效管理

在现代化工企业中&#xff0c;设备管理和能耗监控是至关重要的。易点易动设备管理平台通过整合设备台账、巡检、维修、保养、备件管理、设备监控和能耗监控功能&#xff0c;为化工企业提供了一套全面、高效的解决方案。本文将详细介绍易点易动设备管理平台如何帮助化工企业实现…

JVM字节码分析

文章目录 1、类文件结构1.1、 魔数1.2、 版本1.3 、常量池1.4、 访问标识与继承信息1.5、 Field 信息1.6、 Method 信息1.7 、附加属性 2、字节码指令2.1、javap工具2.2、图解方法执行流程2.2.1 常量池载入运行时常量池2.2.2 方法字节码载入方法区2.2.3 main线程开始运行&#…

windows下另一种傻瓜式从零部署cuda环境的方式

前言 最近因为连续部署了两个深度学习环境&#xff0c;实在嫌烦了&#xff0c;于是摸索出一条简便的方式希望让人人都可以傻瓜式的快速部署&#xff0c;首先确保你的硬盘具有20G以上的空间&#xff0c;这里以部署torch的gpu版和让onnxruntime使用cuda加速为例&#xff0c;让我…