LeetCode 1105. Filling Bookcase Shelves

问题

有一个书的高度和宽度组成的序列,现在需要把这些书按照顺序放进书架子上,书架子的宽度是固定的shelf_widthshelf\_width。现在需要找到书柜最小高度。注意,在上述过程的每个步骤中,我们放置图书的顺序与给定的图书顺序相同。例如,如果我们有一个5本书的有序列表,我们可以把第一和第二本书放在第一个书架上,第三本书放在第二个书架上,第四和第五本书放在最后一个书架上。
在这里插入图片描述

输入: books = [[1,1],[2,3],[2,3],[1,1],[1,1],[1,1],[1,2]], shelf_width = 4
输出: 6
解释:
3个架子的高度之和是1 + 3 + 2 = 6。
注意第二本书不一定要在第一书架上。

解析

在能够放得下的情况下,dp[i] = min(dp[i],min(dp[j]+books[j][1] j[0,i]j\in[0,i])),另外还要创建一个变量用于记录这一层的最大高度。

Java代码

    public int minHeightShelves(int[][] books, int shelf_width) {
        int m = books.length;
        int dp[] = new int[m+1];
        for(int i=0;i<=m;i++){
            dp[i] = Integer.MAX_VALUE;
        }
        dp[0] = 0;
        for(int i=0;i<m;i++){
            int curw=0,max_height=0;
            for(int j=i;j>=0;j--){
                curw += books[j][0];
                max_height = Math.max(max_height, books[j][1]);
                if(curw<=shelf_width){
                    dp[i+1] = Math.min(dp[i+1], dp[j]+max_height);
                }
                else{
                    break;
                }
            }
        }
        return dp[m];
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章