Filling Bookcase Shelves——LeetCode

320 阅读1分钟

算法描述

思想

  • dp[0] = 0
  • h = max(h,books[h][0])
  • 在满足当面width < shelf_width的情况下,计算dp[i] = min(dp[i],dp[j-1]+height)

代码实现

class Solution {
    public int minHeightShelves(int[][] books, int shelf_width) {
        int n = books.length+1;
        int[] dp = new int[n];
        for(int i = 0;i < n;i++){
            dp[i] = Integer.MAX_VALUE;//为了得到最小值,需要设置dp数组中的值为Integer.MAX_VALUE
        }
        dp[0] = 0;
        for(int i = 1;i<n;i++){
            int height = 0;
            int width = 0;
            for(int j = i;j > 0;j--){//只要当前宽度处于shelf_width限制范围内,就可以把前面的书移动到本层,并判断移动后的书架的高度
                width += books[j-1][0];
                if(width > shelf_width){
                    break;
                }
                height = Math.max(height, books[j-1][1]);
                dp[i] = Math.min(dp[i],dp[j-1]+height);
                // System.out.println(dp[i]);
            }
        }
        return dp[n-1];
        
    }
}