文章

每日LeetCode250

2022.1.24 ・ 共 304 字,您可能需要 1 分钟阅读

Tags: LeetCode

堆箱子。给你一堆n个箱子,箱子宽 wi、深 di、高 hi。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法,搭出最高的一堆箱子。箱堆的高度为每个箱子高度的总和。

输入使用数组[wi, di, hi]表示每个箱子。

示例1:

输入:box = [[1, 1, 1], [2, 2, 2], [3, 3, 3]] 输出:6

class Solution {
    public int pileBox(int[][] box) {
        Arrays.sort(box, (a, b) -> {return a[0] - b[0];}
        );
        int[] dp = new int[box.length];
        dp[0] = box[0][2];
        int ans = dp[0];
        for (int i = 1; i < dp.length; i++)  {
            int max = 0;
            for (int j = 0; j < i; j++) {
                if (box[j][0] < box[i][0] && box[j][1] < box[i][1] && box[j][2] < box[i][2])     
                    max = Math.max(max, dp[j]);
            }
            dp[i] = box[i][2] + max;
            ans = Math.max(ans, dp[i]);
        } 
        return ans;
    }
}

先对这个数组进行一维排序,答案序列一定是这个一维排序序列的子序列。

动态规划,dp[i] 为第 i 个箱子能排出来的最大高度, dp[i] = box[i][2] + max(dp[…], 0) 即找到它之前的最小的。