【算法】Filling Bookcase Shelves 填充书架

这篇具有很好参考价值的文章主要介绍了【算法】Filling Bookcase Shelves 填充书架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Filling Bookcase Shelves 填充书架

问题描述:

给定一个数组 books ,其中 b o o k s [ i ] = [ t h i c k n e s s i , h e i g h t i ] books[i] = [thicknessi, heighti] books[i]=[thicknessi,heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。

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

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

需要注意的是,在上述过程的每个步骤中,摆放书的顺序与给定图书数组 books 顺序相同。

例如,如果这里有 5 本书,那么可能的一种摆放情况是:第一和第二本书放在第一层书架上,第三本书放在第二层书架上,第四和第五本书放在最后一层书架上。
每一层所摆放的书的最大高度就是这一层书架的层高,书架整体的高度为各层高之和。

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

books.length , thickness[i],height[i] ,shelfWidth 范围[1,1000]

分析

问题本身是一个具象的书架问题,书本以数组的结构给出,而且限制必须是连续的

也就是说要对数组划分组,每一组的要求是厚度累加不超过书架的宽度 s h e l f w i d t h shelfwidth shelfwidth,同时该层书架的高度是由这一组书中最高的高度决定的。

因为有顺序的限制,问题的难度就小了。

要求计算书架的最小高度。

如果要书架高度最小,最理想的情况,就是一层, h i g h = m a x b o o k high=maxbook high=maxbook

但是由于width的限制,所以每一层的 b o o k book book数量也是由 w i d t h width width限制

从0开始计算,如果 0 → i − 1 0\rightarrow i-1 0i1已经放好,此时为 x x x层, x x x层的高度为 h 1 h1 h1,那么 b o o k [ i ] book[i] book[i]就是新一层的第一本,此刻书架高度就是 h 1 + b o o k [ i ] . h i g h h1+book[i].high h1+book[i].high

定义一个 f [ i ] , f [ i ] 表示 0 → i 本书放完时,书架的最小高度 f[i],f[i]表示 0\rightarrow i本书放完时,书架的最小高度 f[i],f[i]表示0i本书放完时,书架的最小高度

b o o k [ i ] book[i] book[i]为最后一层的第1本, f [ i ] = f [ i − 1 ] + b o o k [ i ] . h i g h f[i]= f[i-1]+book[i].high f[i]=f[i1]+book[i].high,

b o o k [ i ] book[i] book[i]为最后一层的第2本, f [ i ] = f [ i − 2 ] + m a x ( b o o k [ i ] . h i g h , b o o k [ i − 1 ] . h i g h ) f[i]= f[i-2]+ max(book[i].high,book[i-1].high) f[i]=f[i2]+max(book[i].high,book[i1].high),可以推出
f [ i ] = f [ j − 1 ] + m a x ( j   i ) , ∑ j < = p < = i b o o k [ p ] < w i d t h f[i] = f[j-1]+max(j~i), \sum_{j<=p<=i}{book[p]}<width f[i]=f[j1]+max(j i),j<=p<=ibook[p]<width

代码

class Solution {
    public int minHeightShelves(int[][] books, int shelfWidth) {
        int n = books.length;
        int[] dp = new int[n + 1];
        Arrays.fill(dp, 1000000);
        dp[0] = 0;
        for (int i = 0; i < n; ++i) {
            int maxHeight = 0, curWidth = 0;
            for (int j = i; j >= 0; --j) {
                curWidth += books[j][0];
                if (curWidth > shelfWidth) {
                    break;
                }
                maxHeight = Math.max(maxHeight, books[j][1]);
                dp[i + 1] = Math.min(dp[i + 1], dp[j] + maxHeight);
            }
        }
        return dp[n];
    }
} 

时间复杂度 O( N 2 N^{2} N2) 空间复杂度: O ( N ) O(N) O(N)

Tag

Array Dynamic Programming文章来源地址https://www.toymoban.com/news/detail-473426.html

到了这里,关于【算法】Filling Bookcase Shelves 填充书架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ssm基于微信小程序的电子书架的设计与开发(程序+开题)

    本系统(程序 + 源码)带文档 lw 万字以上 文末可获取一份本项目的 java 源码和数据库参考。 研究背景: 随着移动互联网的快速发展,人们对于阅读的需求也越来越高。传统的纸质书籍虽然具有独特的魅力,但受限于携带和存储的不便,无法满足现代人快节奏的生活方式。因

    2024年01月20日
    浏览(47)
  • 【计算机图形学 】扫描线多边形填充算法 | OpenGL+鼠标交互

    传送门 实现多边形扫描线填充算法,并和鼠标进行交互。 具体原理略过,会贴上完整代码,可直接运行。 环境: vs2019,OpenGL的库(可以搜索如何用vs使用OpenGL的库,可以使用vs自带的插件或者其他方法,很方便) 要点: 1.NET和AET的创建,改动 2.改变鼠标点击和鼠标拖拽的响应

    2023年04月08日
    浏览(77)
  • 【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II

    2哥 : 3妹,听说你昨天去面试了,怎么样啊? 3妹 :嗨,别提了,让我回去等通知,估计是没有通知了, 还浪费我请了一天假。 2哥 : 你又请假了啊, 你是怎么跟你那个严厉的老板请假的。 3妹 :我说我2哥生病了,嘿嘿~ 2哥 :一猜就是说我生病了,自从你找工作,我这一年

    2024年02月05日
    浏览(43)
  • Origin曲线填充绘图 填充范围线外的区域

    问题 :如果绘制一条曲线,给其设置上下两个阈值,填充阈值外的区域,如图: 错误 :Origin曲线填充只能识别两个对象,如果只选中曲线-填充,填充会特别混乱,无法填充自己想要的区域: 解决 :只能通过添加图层,将曲线绘制两遍,与两条虚线各分组成一个图层(2个图

    2023年04月12日
    浏览(43)
  • 禁止浏览器自动填充密码功能,设置自动填充背景色。

    text设置autocomplete=“off” password设置 autocomplete=“new-password” 两个一起设置,就不会自动填充了。 自动填充后,阴影颜色变为黑色。 需要设置为0,不显示阴影。 设置完后,自动填充没有阴影了。

    2024年02月16日
    浏览(39)
  • 计算机图形学06:中点Bresenham画圆(并填充边界,例如:边界用红色,内部用绿色填充)

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年01月24日
    浏览(40)
  • 公共字段自动填充工具

    1、问题描述 在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工时需要设置修改时间和修改人等字段。这些字段属于公共字段,也就是很多表中都有这些字段,如下(示例): 字段 类型 create_time datetime update_time datetime create_user bigint update_user bi

    2024年02月16日
    浏览(48)
  • DolphinDb时序自动填充

    语法 asFreq(X, rule, [closed], [label], [origin=’start_day’]) 参数 X 是有时间类型索引的矩阵(由 setIndexedMatrix! 创建)或序列(由 setIndexedSeries! 创建)。 rule 可以是一个字符串,可取以下值,亦可为一个时间类型的向量。 Y参数取值 对应DolphinDB函数 “B” businessDay “W” weekEnd “

    2024年02月08日
    浏览(42)
  • EXCLE下载并填充数据

    自定义EXCEL模板,通过OLE的方式写入数据 实现原理1: 主要用到以下三步,通过SMW0上传EXCEL模板,调用函数DOWNLOAD_WEB_OBJECT下载模板;定义对象参考OLE2_OBJECT,调用其中’Open’的方法打开EXCEL,最后通过定位单元格将数据写进去.( 示例代码2会显示excle的读写过程,在读写过程中

    2024年02月11日
    浏览(35)
  • unity设置图片的填充方式

    功能实现:点击按钮,图片出现,在点击一次,图片消失,可以选择图片出现的方式和出现的位置 新建一个image,拖入一张图片,在Fill Method中选择第四个:Filled(填充)  设置填充方式,开始填充方向,和填充百分比设置不同的图片展示效果 将代码拖到一个Button上,将需要

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包