首页 > 编程语言 >【C++动态规划】1105. 填充书架|2104

【C++动态规划】1105. 填充书架|2104

时间:2024-12-29 17:56:30浏览次数:10  
标签:书架上 书架 int C++ 1105 books shelfWidth dp 2104

本文涉及知识点

下载及打开打包代码的方法兼述单元测试
C++动态规划

LeetCode1105. 填充书架

给定一个数组 books ,其中 books[i] = [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。
按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。
先选几本书放在书架上(它们的厚度之和小于等于书架的宽度 shelfWidth ),然后再建一层书架。重复这个过程,直到把所有的书都放在书架上。
需要注意的是,在上述过程的每个步骤中,摆放书的顺序与给定图书数组 books 顺序相同。
例如,如果这里有 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

动态规划

动态规划的状态表示

dp[i]已经处理了前i本书的最小高度。 空间复杂度:O(n)

动态规划的填表顺序

枚举前置状态,第一层循环:i从0到n-1,第二次循环,枚举当前层是第i到第j本。

动态规划的转移方程

dp[j+1] = min(dp[j+1],dp[i]+max(第[i…j]本书的高度)

动态规划的初始值

dp[0]=0 ,其它全为INT_MAX/2。

动态规划的返回值

dp.back()

代码

核心代码

class Solution {
		public:
			int minHeightShelves(vector<vector<int>>& books, int shelfWidth) {
				const int N = books.size();
				vector<int> dp(N + 1, INT_MAX / 2);
				dp[0] = 0;
				for (int i = 0; i < N; i++) {
					int iMax = 0, iWidth = 0;
					for (int j = i; j < N; j++) {
						iMax = max(iMax, books[j][1]);
						iWidth += books[j][0];
						if (iWidth > shelfWidth)break;
						dp[j + 1] = min(dp[j + 1], dp[i] + iMax);
					}
				}
				return dp.back();
			}
		};

单元测试

vector<vector<int>> books;
		int shelfWidth;
		TEST_METHOD(TestMethod11)
		{
			books = { {1,1},{2,3},{2,3},{1,1},{1,1},{1,1},{1,2} }, shelfWidth = 4;
			auto res = Solution().minHeightShelves(books, shelfWidth);
			AssertEx(6, res);
		}
		TEST_METHOD(TestMethod12)
		{
			books = { {1,3},{2,4},{3,2} }, shelfWidth = 6;
			auto res = Solution().minHeightShelves(books, shelfWidth);
			AssertEx(4, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

标签:书架上,书架,int,C++,1105,books,shelfWidth,dp,2104
From: https://blog.csdn.net/he_zhidan/article/details/143577274

相关文章

  • while循环——c++新手必学第四课
    在学第二课时,我们讲过for循环加上if判断就能循环判断,相当于while。所以,不言而喻,while循环的功能就是循环判断。文章目录一、while循环是什么?二、使用示例1.基本用法总结一、while循环是什么?while循环就是循环判断,也就是if加for的快捷方式。二、使用示例1.......
  • C++ 电子学会二级2024年12月部分考题答案
    1、逆行描述:网上有个段子说:妻子在家听广播,听到某高速路上有一辆车在逆行,想到丈夫在那条高速上行驶,就打电话对丈夫说:“老公啊,你走的那条高速上有一辆车在逆行,你小心点。”她丈夫说:“何止啊!我看好几百辆车都在逆行!”现在我们查了一下高速公路上拍到的好几百辆车的时速,发现有......
  • C++经典面试题50道!!!(秋招必备)
    往期回顾:【QT入门】Qt槽函数五种常用写法介绍-CSDN博客【QT入门】QListWidget各种常见用法详解之列表模式-CSDN博客【QT入门】Qt自定义控件与样式设计之QPushButton常用qss_qpushbuttonqss-CSDN博客50道资源完整版:https://download.csdn.net/download/LF__plus/902......
  • C++异常处理机制学习(持续更新)
    具体的异常要回去学中断这些,我打算到时候再细致研究,故而这里只是粗浅地讨论C++的异常处理机制.(其实没太看懂原理和应用的关系,以后还要深入研究)首先我们要探究一下seh异常处理机制,从与其相关的数据结构讲起.TIB结构TIB(ThreadInfoimationBlock,线程信息块)是保存线程......
  • c++11新特性
    智能指针1.管理内存释放问题2.共享所有权和转移//用的最多,内涵一个指向计数器,计数器归0的时候,释放对应的内存//指针本身在栈里面存储,指向的内容是放在堆里面的,栈可以自动释放,堆不可以shared_ptr//检测内存有没有被释放,被释放了就不用了,没被释放才做一些操作weak_ptr//纯......
  • C++(getchar())
    目录1.函数原型2.功能3.常见用法4.与getchar()的区别5.处理输入错误6.注意事项7.总结getchar()是C和C++中的一个标准输入函数,定义在头文件<cstdio>或<stdio.h>中。它用于从标准输入流(通常是键盘)读取一个字符。1.函数原型intgetchar(void);返回值:成......
  • 【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
    目录......
  • C++中的concept
    concept概述:是C++20引入的新机制,旨在提供一种类型约束机制,使得模板的使用更加直观、可读且类型安全示例:#include<iostream>#include<concepts>#include<string>//定义concepttemplate<typenameT>conceptIncrementable=requires(Tx){{++x}->st......
  • C++中的完美转发
    完美转发背景:C++的参数传递常常面临以下问题:左值和右值:左值和右值在处理上有区别,通常左值被传递时需要按值传递,而右值可能会被按引用传递以避免不必要的拷贝引用折叠(ReferenceCollapsing):C++中的引用折叠规则(T&&类型的引用会折叠成不同的类型)也会影响完美转发的实现需......
  • Rust和C/C++相关调用总结
    一.Windows下Rust与C/C++互相调用1.C/C++调用rust1.1动态库调用1.1.1以LoadLibrary方式显示调用add.rs#[no_mangle]//防止Rust修改函数名pubextern"C"fnhello_world(){println!("HellofromRust!");}#[no_mangle]pubextern"C"fnadd(a:i32,b:i3......