盒子堆叠算法

时间:2013-11-15 16:01:22

标签: algorithm dynamic-programming

我对此处建议的盒子堆叠算法有疑问: http://people.csail.mit.edu/bdean/6.046/dp/

该算法做出了一些错误的假设: 在视频中,它说我们“按照基础区域等的顺序对盒子进行分类”。 我们这样做是因为只有当上部放置框的宽度和深度分别小于下部框的宽度和深度时,才能将框放置在另一个框的顶部。 但如果框B_1的基本区域大于框B_2,则并不意味着它的宽度和深度也大于框B_2的宽度和深度。

例如,具有1x8基本尺寸的框具有比具有2x3尺寸的框更大的基础区域,但是仍然:1 <2(和1 <3),因此我们不能将框B_2堆叠到B_1上。 我在这里错过了什么?

2 个答案:

答案 0 :(得分:4)

这是一个必要条件和充分条件的问题。确实,您可以遇到B_2无法堆叠在B_1上的情况,但在这种情况下,B_1也无法堆叠在B_2上,因此在考虑顺序中切换它们没有任何价值。也就是说,如果B_a具有比B_b更大的基数,我们知道B_a不能堆叠在B_b上(因为它至少有一个维度违反约束)。

换句话说:在最佳的盒子堆栈中,所有都是通过减少基本面积来排序的。因此,如果通过减小基本区域来排序所有框的列表,则保证最佳堆栈是所有框的列表的子序列 - 因此,当然,仅由前k个框组成的序列。这意味着,根据动态编程的要求,当检查框k时,框k可以依赖的最佳堆栈已经在上一轮中生成。

答案 1 :(得分:0)

令人困惑的是如何呈现它,但重点是找到一个序列,您可以从中应用LIS(最少增加的子序列)。