此题解采用动态规划的思想。首先对箱子进行排序,便于后续比较。之后,定义一个数组 h,其中 h[i] 表示以第 i 个箱子为顶部箱子时能达到的最大高度。对于每个箱子 i,遍历在其之前的所有箱子 j,检查是否可以把箱子 j 堆放在箱子 i 下面(即满足 wi > wj, di > dj, hi > hj 的条件)。如果可以,则计算如果以箱子 j 为基底时的总高度,更新 h[i]。最终,遍历所有的 h[i],找到最大值即为答案。
时间复杂度: O(n^2)
空间复杂度: O(n)
class Solution:
def pileBox(self, box: List[List[int]]) -> int:
res = 0 # 最终的最大高度
box.sort() # 对箱子进行排序
n = len(box) # 箱子的数量
h = [0] * n # h[i] 代表以第i个箱子为顶层时的最大高度
for i in range(n):
wi, di, hi = box[i] # 当前箱子的宽度,深度,高度
pref = 0 # 记录当前可堆叠的最大高度
for j in range(i):
wj, dj, hj = box[j] # 前一个箱子的宽度,深度,高度
if wj < wi and dj < di and hj < hi and h[j] > pref:
pref = h[j] # 更新可堆叠的最大高度
h[i] = pref + hi # 更新以当前箱子为顶层时的最大高度
res = max(res, h[i]) # 更新结果最大高度
return res # 返回最大高度