JAVA练习185-堆箱子

堆箱子。给你一堆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) 


                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值