Python 中填充书架
假设我们有一系列书籍 - 这里第 i 本书的厚度为 books[i][0],高度为 books[i][1]。如果我们想按顺序将这些书放在总宽度为 shelf_width 的书架上。如果我们选择一些书放在这个书架上(使得它们的厚度之和 <= shelf_width),然后构建书柜的另一层,书柜的总高度增加了我们可以放下的书籍的最大高度。我们将重复此过程,直到没有更多书籍可以放置。我们必须记住,在上述过程的每个步骤中,我们放置书籍的顺序与给定的书籍序列的顺序相同。我们必须找到以这种方式放置书架后书架的总高度的最小可能高度。因此,如果输入类似于 - [[1,1], [2,3], [2,3], [1,1], [1,1], [1,1], [1,2]],并且 self_width = 4,
则输出将为 6,因为 3 个书架的高度之和为 1 + 3 + 2 = 6。请注意,第 2 本书不必放在第一个书架上。
为了解决这个问题,我们将遵循以下步骤 -
- 创建一个大小与 books 相同的数组 dp,并使用无限填充它
- dp[0] := books[0,1]
- 对于 i 从 1 到 books 的长度 - 1
- curr_height := 0
- temp := self_width
- j := i
- 当 j >= 0 且 temp – books[j, 0] >= 0 时,执行
- curr_height := books[j, 1] 和 curr_height 的最大值
- dp[i] := dp[i]、curr_height + (如果 j – 1 >= 0 则为 dp[j - 1],否则为 0) 的最小值
- temp := temp – books[j, 0]
- 将 j 减 1
- 返回 dp 的最后一个元素
让我们看看以下实现以更好地理解 -
示例
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))] dp[0] = books[0][1] for i in range(1,len(books)): current_height = 0 temp = shelf_width j = i while j>=0 and temp-books[j][0]>=0: current_height = max(books[j][1],current_height) dp[i] = min(dp[i],current_height +( dp[j-1] if j-1 >=0 else 0)) temp-=books[j][0] j-=1 #print(dp) return dp[-1]
输入
[[1,1],[2,3],[2,3],[1,1],[1,1],[1,1],[1,2]] 4
输出
6
广告