【leetcode】1105. Filling Bookcase Shelves
题目如下:
We have a sequence of
books
: thei
-th book has thicknessbooks[i][0]
and heightbooks[i][1]
.We want to place these books in order onto bookcase shelves that have total width
shelf_width
.We choose some of the books to place on this shelf (such that the sum of their thickness is
<= shelf_width
), then build another level of shelf of the bookcase so that the total height of the bookcase has increased by the maximum height of the books we just put down. We repeat this process until there are no more books to place.Note again that at each step of the above process, the order of the books we place is the same order as the given sequence of books. For example, if we have an ordered list of 5 books, we might place the first and second book onto the first shelf, the third book on the second shelf, and the fourth and fifth book on the last shelf.
Return the minimum possible height that the total bookshelf can be after placing shelves in this manner.
Example 1:
Input: books = [[1,1],[2,3],[2,3],[1,1],[1,1],[1,1],[1,2]], shelf_width = 4
Output: 6
Explanation:
The sum of the heights of the 3 shelves are 1 + 3 + 2 = 6.
Notice that book number 2 does not have to be on the first shelf.Constraints:
1 <= books.length <= 1000
1 <= books[i][0] <= shelf_width <= 1000
1 <= books[i][1] <= 1000
解题思路:比起大神们的算法,我的dp算法多了一维,差距还是很大的。记dp[i][j] = v 表示第i本书是第j层的最后一本书时,书架第0层到第j层的高度的最小值是v。如果第j-1层的最后一本书是k,那么有dp[i][j] = min(dp[i][j],dp[k][j-1] + max(books[k+1] ~books[i])。有了这个状态转移方程,接下来就是求k的可能取值,每一层至少要有一本书,所以k的最大值只能是i-1,最小值则要通过计算得出,详见代码。
代码如下:
class Solution(object):
def minHeightShelves(self, books, shelf_width):
"""
:type books: List[List[int]]
:type shelf_width: int
:rtype: int
"""
dp = [[float('inf') for i in range(len(books))] for i in range(len(books))]
dp[0][0] = books[0][1] width = 0
level = 0
level_list_per_item = []
for i in range(len(books)):
if width + books[i][0] <= shelf_width:
level_list_per_item.append(level)
width += books[i][0]
else:
level += 1
level_list_per_item.append(level)
width = books[i][0] for i in range(1,len(books)):
for j in range(level_list_per_item[i],i+1):
if j > 0:
dp[i][j] = min(dp[i][j],dp[i-1][j-1] + books[i][1])
row_width = books[i][0]
row_max_height = books[i][1]
for k in range(i-1,j-2,-1):
if row_width + books[k][0] <= shelf_width:
row_width += books[k][0]
row_max_height = max(row_max_height,books[k][1])
if k == 0:
dp[i][j] = min(dp[i][0] ,row_max_height)
continue
dp[i][j] = min(dp[i][j],dp[k-1][j-1]+ row_max_height)
else:
break
#print dp
return min(dp[-1])
【leetcode】1105. Filling Bookcase Shelves的更多相关文章
- LeetCode 1105. Filling Bookcase Shelves
原题链接在这里:https://leetcode.com/problems/filling-bookcase-shelves/ 题目: We have a sequence of books: the ...
- 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
[LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...
- 【Leetcode】Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...
- 53. Maximum Subarray【leetcode】
53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...
- 27. Remove Element【leetcode】
27. Remove Element[leetcode] Given an array and a value, remove all instances of that value in place ...
- 【刷题】【LeetCode】007-整数反转-easy
[刷题][LeetCode]总 用动画的形式呈现解LeetCode题目的思路 参考链接-空 007-整数反转 方法: 弹出和推入数字 & 溢出前进行检查 思路: 我们可以一次构建反转整数的一位 ...
- 【刷题】【LeetCode】000-十大经典排序算法
[刷题][LeetCode]总 用动画的形式呈现解LeetCode题目的思路 参考链接 000-十大经典排序算法
- 【leetcode】893. Groups of Special-Equivalent Strings
Algorithm [leetcode]893. Groups of Special-Equivalent Strings https://leetcode.com/problems/groups-o ...
- 【leetcode】657. Robot Return to Origin
Algorithm [leetcode]657. Robot Return to Origin https://leetcode.com/problems/robot-return-to-origin ...
随机推荐
- Unity中的动画系统和Timeline(5) Timeline
在前面的动画,都是控制单独的物体,比如说控制一个角色的运动.而Timeline,可以对多个物体实施动画,形成过场动画,或者电影效果.比如,很多赛车游戏比赛开始前都会播放一段开场动画,围绕自己车的几个方 ...
- python学习之模块-模块(五)
5.10 包 5.10.1 包的概念 [官网解释] Packages are a way of structuring Python's module namespace by using " ...
- python学习之内置函数(一)
4.7 内置函数 4.7.1 内置函数(1) eval 执行字符串类型的代码,并返回最终结果. eval('2 + 2') # 4 n=81 eval("n + 4") # 85 ...
- win10更新导致chrome打开网页速度太慢
升级win10之后如果出现chrome内核的浏览器网页总是打不开 打开很慢 而ie和edge是可以正常访问的 用这个方法可以 我弄了几天终于 搞好了 我直接转载过来了 近期,工程师收到大量反馈360浏 ...
- 第八周课程总结-实验报告六(Java异常)
理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法 实验要求 练习捕获异常.声明异常.抛出异常的方法.熟悉try和catch子句的使用. 掌握自定义异常类的方法 实验内容 编写一个类,在其 ...
- Elasticsearch-安装、日志解读
ES-安装.日志解读 1. 准备tar包 https://www.elastic.co/cn/products/elasticsearch2. 解压 tar -zxvf elasticsearch-. ...
- keepalived 容器在宿主机重启后无法启动问题:报错:daemon is already running
初步猜测原因是:keepalived容器内的keepalived.pid文件在keepalived容器非正常退出时,没有正确删除,造成第二次启动时容器检查到pid文件已经存在,认为该进程已经存在,因为 ...
- POJ 2955 Brackets 区间DP 入门
dp[i][j]代表i->j区间内最多的合法括号数 if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp[i][j] ...
- Windows7下Pycharm安装Keras
1.安装Anaconda3 2.安装Pycharm 3.安装TensorFlow 一.File -> Settings -> Install 二.搜索TensorFlow -> In ...
- PHP生成excle文件
excle_word.php /*** * 生成excle文件 ***/ $time = time(); $filename = date("Y年m月d日h点m分s秒", $tim ...