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];
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章