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 0→i−1已经放好,此时为 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]表示0→i本书放完时,书架的最小高度。
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[i−1]+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[i−2]+max(book[i].high,book[i−1].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[j−1]+max(j i),j<=p<=i∑book[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文章来源:https://www.toymoban.com/news/detail-473426.html
Array
Dynamic Programming
文章来源地址https://www.toymoban.com/news/detail-473426.html
到了这里,关于【算法】Filling Bookcase Shelves 填充书架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!