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_ 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]