堆箱子。给你一堆n个箱子,箱子宽 wi、深 di、高 hi。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法,搭出最高的一堆箱子。箱堆的高度为每个箱子高度的总和。
输入使用数组[wi, di, hi]表示每个箱子。
示例1:
输入:box = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
输出:6
示例2:
输入:box = [[1, 1, 1], [2, 3, 4], [2, 6, 7], [3, 4, 5]]
输出:10
提示:
- 箱子的数目不大于3000个。
分析:
方法:排序+动态规划
因为严格要求箱子长宽高都要大于前面箱子,因此我们先将箱子按照长的大小进行排序,宽高可以视为一个变量,这样问题就从二维问题转化为了一维问题。令第 n 个箱子能堆的最大高度为 dp[n],那么 dp[n] 的值不是为它自己,就是为与前面某个满足条件的箱子的最大高度之和,令某个箱子的索引为 m,可以写出转移方程:
dp[n] = max{ dp[n], dp[m] + box[n][2] }
( n > m 且 box[n][0] > box[m][0], box[n][1] > box[m][1], box[n][2] > box[m][2] )
时间复杂度:O(n!) n 为箱子数
空间复杂度:O(n)