标签:时间 shelf elf min 问题 初始化 lin nbsp vector
本题第一眼看上去很难,但是实际上并不是二维的问题,而是一个一维的数组分段的问题。
本题需要格外注意下标,很容易出错。
为了减少对第一本书的初始化,记 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
标签:时间 shelf elf min 问题 初始化 lin nbsp vector
原文地址:https://www.cnblogs.com/hankunyan/p/11186755.html