LeetCode 1105. Filling Bookcase Shelves
Posted hankunyan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1105. Filling Bookcase Shelves相关的知识,希望对你有一定的参考价值。
本题第一眼看上去很难,但是实际上并不是二维的问题,而是一个一维的数组分段的问题。
本题需要格外注意下标,很容易出错。
为了减少对第一本书的初始化,记 dp[i] 为前i本书所需的最小高度,即下标 0~i-1,初始条件为 dp[0]=0
用j表示从下标j开始放到下一个row,即 [j~i-1] 为新的一层。0≤j≤i-1
dp[i] = min_j dp[j] + height from index j~i-1 (index j~i-1 should < shelf_width) 0≤j≤i-1
j从后往前遍历是为了在 width 超过的情况下早点退出循环。
class Solution public: int minHeightShelves(vector<vector<int>>& books, int shelf_width) int n=books.size(); // dp[i] - first i books [0~i-1] // dp[i] = min_j dp[j] + height from index j~i-1 (index j~i-1 should < shelf_width) 0<=j<=i-1 vector<int> dp(n+1,INT_MAX/2); dp[0] = 0; for (int i=1;i<=n;++i) int height=0, width=0; for (int j=i-1;j>=0;--j) width += books[j][0]; if (width>shelf_width) break; height = max(height,books[j][1]); dp[i] = min(dp[i], dp[j]+height); return dp[n]; ;
时间复杂度 O(n^2)
以上是关于LeetCode 1105. Filling Bookcase Shelves的主要内容,如果未能解决你的问题,请参考以下文章