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

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

题目详情

分析

  1. 读题,就是将长方形进行堆叠,但是下面一个长方体的长宽高均要比上面一个长方体的长宽高的值要大
  2. 最开始反映过来的解法应该是贪心,即找到长方体在最长的高,然后如果可以堆积就堆积,不能堆积就抛弃。但是仔细考虑,会发现存在一些问题,如[[95,37,53],[56,55,38],[55,54,46],[45,23,12]],若是正确答案,则应该是2、3、4,若贪心的画,只会是1、4
  3. 既然贪心不行,则需要考虑动态规划来解题。
  4. 因为每一个长方体的长宽高大小不一致,所以我们需要对每一个长方体进行排序,将每个长方体的长宽高按从小到大的顺序排,那么高一定的最后的一个值,再对所有的长方体进行排序,将长宽高和最大的长方体放在最前面。若长方体的长宽高的和为A>B>C>D,那么如A在C下面,C在D下面,那么A一定在D的下面,[[10,20,75],[30,30,40],[7,8,9],[4,5,8]]

动态规划的分析:

  1. 如果在第i层的时候答案是最优解,那么在第i-1层的时候,i-1层的答案就是i-1层的最优解
  2. 如果高度是从底到高的分析,那么贡献值(长方体的高度)是逐渐增大的。对于第i层而已,i+1层的贡献值比i多。当i+1层不符合条件的时候,我们可以减去n层来让i+1层的值满足条件,如果满足条件后的i+1层的值比原来的最高贡献值大,那么此值就是到目前的最优解

官方题解

    public int maxHeight(int[][] cuboids) {
        int n = cuboids.length;
        for (int[] v : cuboids) {
            Arrays.sort(v);
        }

        Arrays.sort(cuboids, (a, b) -> (a[0] + a[1] + a[2]) - (b[0] + b[1] + b[2]));
        int ans = 0;

        int[] dp = new int[n];

        for (int i = 0; i < n; i++) {
            // 得到最上面一层的高度
            dp[i] = cuboids[i][2];

            for (int j = 0; j < i; j++) {
                // 到第i层位置
                // 第二层的长宽高比第一层的长宽高大,那么将第二层的长宽高最优解保存下来,进入第三层
                // 第三层的长宽高比第1层的大,那么第三层上面能放第1层,将第三层的最优解变为当前高度+第1层的最优解高度
                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]);
                }
            }

            ans = Math.max(ans, dp[i]);
        }
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值