【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 <= 10001 <= books[i][0] <= shelf_width <= 10001 <= 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 ...
随机推荐
- crond服务总结
昨天翻阅程序发现服务器端管理程序的启动方式很特别,在之前是由init进程启动程序脚本里的进程,昨天发现服务程序并没有在任何脚本中有启动的体现,但是服务程序确实是启动了,经过一番查找发现原来是crond ...
- typedef interrupt void (*PINT)(void)的分析
今天写程序时,在DSP2833x_PieVect.h看到typedef interrupt void (*PINT)(void)突然一愣,上网查了下发现在这是加了interrupt 中断关键字的函数指 ...
- 在windows上远程访问服务器jupyter notebook
需求: 之前在服务器上只能运行完整的python文件,而不能实现jupyter notebook的交互模式,通过在本地浏览器上远程访问服务器上的jupyter notebook,这样不就能有一个很棒的 ...
- 双系统正确卸载Ubuntu系统
双系统正确卸载Ubuntu系统 安装系统后由于显卡驱动问题,无法开机,从而只能卸载重装,重装过程如下. 第一步:下载需要的工具包,这里我用的是MBRfix, 可以直接从我分享的网盘链接下载,密码gw ...
- 【VS开发】设置文档标题
[注意]我们注意到我们的文档的创建的时候我们会发现系统会去调用Doc类中的OnNewDocument函数,这里我们知道他是一个虚函数,我们可以在这里设置我们的文档的标题. 代码如下: BOOL CGr ...
- lua基础学习(六)
一.lua协同程序coroutine 1.什么是协同(coroutine)?Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共 ...
- CDH6.2扩容
参考: yum方式扩容: https://www.cnblogs.com/yinzhengjie/articles/11104776.html 二进制包方式扩容: https://www.cnblog ...
- BATJ的常见java面试题
JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗,为什么. 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允 ...
- 【中间件】Kafka 学习 01
KafKa 博客教程-1 博客教程-2 kafka简介 kafka起源 Kafka是由LinkedIn开发并开源的分布式消息系统,2012年捐赠给Apache基金会,采用Scala语言,运行在JVM中 ...
- Comet OJ - Contest #5 E 迫真大游戏
怎么说,看了推到之后真的不难,事实上确实也蛮友好(可能咱就是想不出多项式题目的做法???),除了用到了分治法法塔就比较毒瘤 花了一个晚上以及一个上午做这么一道题...(还是太菜了) Result1 分 ...
