每日一题——1691. 堆叠长方体的最大高度

171 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情


1691. 堆叠长方体的最大高度

给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] = [widthi, lengthi, heighti]下标从 0 开始)。请你从 cuboids 选出一个 子集 ,并将它们堆叠起来。

如果 widthi <= widthj 且 lengthi <= lengthj 且 heighti <= heightj ,你就可以将长方体 i 堆叠在长方体 j 上。你可以通过旋转把长方体的长宽高重新排列,以将它放在另一个长方体上。

返回 堆叠长方体 cuboids 可以得到的 最大高度 。

 

示例 1:

image.png

输入: cuboids = [[50,45,20],[95,37,53],[45,23,12]]
输出: 190
解释:
第 1 个长方体放在底部,53x37 的一面朝下,高度为 95 。
第 0 个长方体放在中间,45x20 的一面朝下,高度为 50 。
第 2 个长方体放在上面,23x12 的一面朝下,高度为 45 。
总高度是 95 + 50 + 45 = 190

 

提示:

  • n == cuboids.length
  • 1 <= n <= 100
  • 1 <= widthi, lengthi, heighti <= 100

思路

首先,若要获得最大高度,需要将长方体最长的边作为高,同时保证不同长方体的长宽是顺序排列的,题目要求下方长方体的长宽高都要大于等于上方长方体的长宽高,故可以先对所有的长方体按大小进行排序。

定义 dp[i] 为第 i 个长方体作为最底层长方体时,可到达的最大高度。

此时就需要计算其上层长方体的高度,并依次判断以获取最大高度。如果上层长方体满足条件,则可以计算在第 i 个长方体上堆叠该上层长方体所达到的高度。

状态转移方程为 dp[i] = Math.max(dp[i], dp[j] + cuboids[i][2]) ,若上层长方体 j 的长宽高小于等于长方体 i,则可在长方体 j 的底层叠加长方体 i 的高度。

题解

class Solution {
    public int maxHeight(int[][] cuboids) {
        for(int[] arr: cuboids) {
            Arrays.sort(arr);
        }
        Arrays.sort(cuboids, (o1, o2) -> (o2[0] + o2[1] + o2[2] - (o1[0] + o1[1] + o1[2])));
        int n = cuboids.length;
        int[] dp = new int[n];
        int max = 0;
        for(int i = n - 1; i >= 0; i--) {
            dp[i] = cuboids[i][2];
            for(int j = i + 1; j < n; j++) {
                if(cuboids[i][0] >= cuboids[j][0] && cuboids[i][1] >= cuboids[j][1] && cuboids[i][2] >= cuboids[j][2]) {
                    dp[i] = Math.max(dp[i], dp[j] + cuboids[i][2]);
                }
            }
            max = Math.max(dp[i], max);
        }
        return max;
    }
}