1105. 填充书架-M

label: dp、暴力

附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上。

你把要摆放的书 books 都整理好,叠成一摞:从上往下,第 i 本书的厚度为 books[i][0],高度为 books[i][1]。

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

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

需要注意的是,在上述过程的每个步骤中,摆放书的顺序与你整理好的顺序相同。 例如,如果这里有 5 本书,那么可能的一种摆放情况是:第一和第二本书放在第一层书架上,第三本书放在第二层书架上,第四和第五本书放在最后一层书架上。

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

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

示例:

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

提示:

1 <= books.length <= 1000
1 <= books[i][0] <= shelf_width <= 1000
1 <= books[i][1] <= 1000

分析:这是一道周赛题,当时比较困惑,如何选择最小高度的那一组呢?后来再看这道题,题目要求按照给定的顺序放书,这样我们就好弄了,也正式因为按照给定顺序,我们才能用动态规划

方法1: 最开始想的笨办法,就是套用dp模版,结果写出来的应该是个暴力方法,dp[i][j]表示从i开头到j的堆放最小高度,递推方式

dp[i][j]=min{dp[i][k]}+books[j][1],0&lt;k&lt;j,dp[i][j]=min\{ dp[i][k] \}+books[j][1],0&lt; k &lt; j, dp[i][j]=min{dp[i][k]}+books[j][1],0<k<j,

最后,从能够达到size的dp[i][size]中选择最小的即是目标。
output=min{dp[i][size]},0&lt;i&lt;sizeanddp[i][size]&gt;0output=min\{dp[i][size]\},0&lt; i &lt; size \ and \ dp[i][size]&gt;0 output=min{dp[i][size]},0<i<size and dp[i][size]>0

该方法时间复杂读O(N ^ 3),空间O(N ^ 2)

方法2: 这是真正的dp,其思想是判断下一本书是放在上一本书的右侧好还是下侧好,右侧,需要往回看shelf_width的数据,以确定该层放基本书,再上一层用dp记录的结果即可。dp[i]表示当前[0,i]这些书放在书架上的最小高度,往回看时用到dp[j],min(dp[i],tmpH+dp[j]),dp[j]为上一层最右的一本书的堆放最小高度。

dp[i]=min{max{books[j][1]}+dp[j−1],dp[i−1]+books[i][1]},0&lt;j&lt;=iand∑books[j][0]&lt;=shelfwidthdp[i]=min\{max\{books[j][1]\}+dp[j-1],dp[i-1]+books[i][1]\},0&lt; j &lt;= i \ and \ \sum{books[j][0]}&lt;= shelf_width dp[i]=min{max{books[j][1]}+dp[j−1],dp[i−1]+books[i][1]},0<j<=i and ∑books[j][0]<=shelfw​idth

这里需要注意,dp更新要放在,会看shelf_width宽度是,因为具体这一层放几个,到那最优,需要再过程中确定,而不能看完shelf_width再计算。

暴力

/*
执行用时 :28 ms, 在所有 Go 提交中击败了27.27%的用户
内存消耗 :10.8 MB, 在所有 Go 提交中击败了100.00%的用户
*/
func minHeightShelves(books [][]int, shelf_width int) int {size:=len(books)dp:=make([][]int,size+1)dw:=make([]int,size+1)dp[0]=make([]int,size+1)for i:=1;i<size+1;i++{dp[i]=make([]int,size+1)dw[i]=dw[i-1]+books[i-1][0]}mx:=math.MaxInt32for i:=1;i<=size;i++{for j:=i;j<=size;j++{if dw[j]-dw[i-1]<=shelf_width{//find minmi:=dp[i-1][i-1]for k:=1;k<i;k++{if dp[k][i-1]>0&&mi>dp[k][i-1]{mi=dp[k][i-1]}}dp[i][j]=books[j-1][1]+miif dp[i][j]<dp[i][j-1]{//每一行的高度,maxdp[i][j]=dp[i][j-1]}}}if dp[i][size]>0&&dp[i][size]<mx{mx=dp[i][size]}}return mx
}

动态规划

package main
import  "fmt"
/*
执行用时 :3 ms, 在所有 Go 提交中击败了86.36%的用户
内存消耗 :3 MB, 在所有 Go 提交中击败了100.00%的用户
*/
//1105. Filling Bookcase Shelves
func minHeightShelves(books [][]int, shelf_width int) int {size:=len(books)dp:=make([]int,size+1)for i:=1;i<=size;i++{tmpW,tmpH:=books[i-1][0],books[i-1][1]dp[i]=dp[i-1]+books[i-1][1] //下for j:=i-1;j>0;j--{tmpW+=books[j-1][0]if tmpW>shelf_width{ break }//要确保tmpH是准确的,不要计算到范围外的Hif tmpH<books[j-1][1]{ tmpH=books[j-1][1] }if tmpH+dp[j-1]<dp[i]{//右dp[i]=tmpH+dp[j-1]}}}return dp[size]
}
func main() {tables:=[][][]int{{{1,1},{2,3},{2,3},{1,1},{1,1},{1,1},{1,2},{4}}, //6{{9,9},{5,4},{3,1},{1,5},{7,3},{10}}, //17{{7,3},{8,7},{2,7},{2,5},{10}},}for _,v:=range tables{fmt.Println(minHeightShelves(v[:len(v)-1],v[len(v)-1][0]))}
}

105. 填充书架-M相关推荐

  1. leetcode - 1105. 填充书架

    1105. 填充书架 -------------------------------------------- 附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上. 你把 ...

  2. leetcode1105. 填充书架(动态规划)

    附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上. 你把要摆放的书 books 都整理好,叠成一摞:从上往下,第 i 本书的厚度为 books[i][0],高度为 bo ...

  3. LeetCode 1105. 填充书架(DP)

    文章目录 1. 题目 2. 解题 1. 题目 附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上. 你把要摆放的书 books 都整理好,叠成一摞:从上往下,第 i 本书 ...

  4. leetcode算法题--填充书架★★

    原题链接:https://leetcode-cn.com/problems/filling-bookcase-shelves/ 动态规划 dp[i]表示第i本书之前最小高度 状态转移: dp[i]=m ...

  5. Leetcode题目分类指南(单独刷题或学习算法书籍配合使用)

    Leetcode题目分类指南 笔者在学习<算法导论>同时,希望能够配合Leetcode的题目进行分类模块化练习,该分类为笔者自己根据做题学习经验,结合<算法导论>的内容,给出L ...

  6. 如何学好C语言--你的学渣朋友告诉你

    光说不练假把式,光练不说傻把式,又练又说真把式. 真实感受,不是我不想学,是我真的不知道我哪里不会啊和得怎么做啊?本文作者当初就是这么废掉的 推荐两个练习的网站 (一)C语言网 https://www ...

  7. LeetCode 刷题之路(python版)

    摘自:https://blog.csdn.net/qq_32384313/article/details/90745354 LeetCode 刷题之路(python版) 小坏wz 2019-06-02 ...

  8. 动态规划(持续更新、整理)

    动态规划 记忆化搜索 不同路径:leetcode-62 分割回文串:leetcode-131 单词拆分II:leetcode-140 戳气球:leetcode-312 零钱兑换:leetcode-32 ...

  9. 动态规划经典问题整理

    单序列: 最长连续递增序列  最长递增子序列   最长递增子序列的个数  最大子序和   最大整除子集 爬楼梯最长定差子序列  爬楼梯 使用最小花费爬楼梯 比特位计数 旋转数字 把数字翻译成字符串 青 ...

最新文章

  1. 特征工程之MinMaxScaler、StandardScaler、Normalizer、Binarizer
  2. PM2 进程管理工具使用总结
  3. Quartz.Net进阶之二:关于触发器的更多信息
  4. win10快速搭建scala环境
  5. Protobuf动态解析那些事儿
  6. 痛苦并愉快的被洗着_品牌洗脑
  7. java 两个数据合并_R:两个数据帧合并
  8. Cisco ASA防火墙基础--转载http://wenzhongxiang.blog.51cto.com/6370734/1249746
  9. 1月16日新经济智库大会聚焦数字经济,议程、直播全收藏
  10. P1713 麦当劳叔叔的难题(90分)
  11. 中软国际软件测试培训中心,中软国际准员工培养计划C++开发/软件测试方向开班典礼...
  12. Qt播放视频0x8007000e报错 DirectShowPlayerService::doPlay: Unresolved error code 0x8007000e
  13. java.lang.IllegalArgumentException: Receiver not registered
  14. 用AI如何预测《权力的游戏》死亡名单?真是神了!
  15. mx播放器有没有投屏功能_手机投屏到电视有5种方法,跟我这样操作,仅需2步就搞定...
  16. MDK AC6开启FPU移植DSP库时报错Error: L6242E: Cannot link object arm_cos_f32.o as its attributes are incompat
  17. 【NOIP2015提高组Day1】斗地主
  18. (转)[视频压制/转换技术] I帧 B帧 P帧 IDR帧 等帧用途详细说明
  19. c语言赋值运算与除法运算顺序,C语言运算符的优先级和结合律
  20. 致敬2020——打工人的成长故事

热门文章

  1. oracle itl 故障,ORACLE ITL事务槽
  2. Java Logging之JUL系列——LogRecord
  3. 发送测试电子邮件消息 响应服务器 550,Microsoft SMTP 服务器在第三方测试中可能显示为能够接受并中继电子邮件...
  4. 数学史资料:古巴比伦数学
  5. pandas_datareader下载雅虎财经股价数据
  6. lammps教程:薄膜渗透模拟(3)--不同孔隙率对过滤效果的影响
  7. 【音视频】SEI简介
  8. static 和 extern水火不容。
  9. 中国Linux与微软斗法北京谋变,从水火不容到共生(转)
  10. C语言、编程语言发展史