码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 1105. Filling Bookcase Shelves

时间:2019-07-15 09:27:34      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:时间   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!