1 """
2 本题简单的一点就在于摆放的顺序和原顺序一致
3 定义dp[i]为前i本书能够到达的最小高度。
4 则对于第i+1本书,有两类选择。
5 如自己单独一层,则状态转移方程为dp[i+1] = dp[i] + h[i+1]
6 如果和前面的书放在一起,则状态转移方程为
7 dp[i+1] = min(dp[j] + max[h[j+1] ~ h[i+1])),
8 其中需要满足sum(w[j+1] ~ w[i+1]) <= shelf_width,含义是前j本书组成若干层,第j+1到第i+1本书组成一层。
9 对于这些选择,取最小值
10 链接:https://www.jianshu.com/p/cf4c0054db09
11 """
12 class Solution:
13 def minHeightShelves(self, books, shelf_width):
14 dp = [float('inf')]*(len(books)+1)
15 dp[0] = 0
16 for i in range(1, len(books)+1):
17 width, j, height = 0, i, 0
18 while j > 0:
19 width += books[j-1][0]
20 if width > shelf_width:
21 break
22 height = max(books[j-1][1], height)
23 dp[i] = min(dp[i], dp[j-1]+height)
24 j -= 1
25 return dp[-1]