问题:给你一组n种矩形3-D盒子,其中第i个盒子有高度h(i),宽度w(i)和深度d(i)(所有实数)。你想要创建一个尽可能高的盒子堆叠,但如果下盒子的2-D底座的尺寸都严格大于2的盒子,你只能在另一个盒子的顶部堆叠一个盒子。高架子的D基座。当然,您可以旋转一个框,以便任何一侧作为其基础。也允许使用相同类型的盒子的多个实例。
解决方案:我在http://www.geeksforgeeks.org/dynamic-programming-set-21-box-stacking-problem/
找到了以下解决方案1)生成所有盒子的所有3个旋转。旋转数组的大小是原始数组大小的3倍。为简单起见,我们认为深度始终小于或等于宽度。
2)按照基本区域的降序对上面生成的3n框进行排序。
3)对方框进行排序后,问题与LIS相同,具有以下最佳子结构属性。 MSH(i)=最大可能的堆栈高度,堆栈顶部的框i MSH(i)= {Max(MSH(j))+ height(i)}其中j <1。 i和宽度(j)>宽度(i)和深度(j)>深度(i)中。 如果没有这样的j,那么MSH(i)= height(i)
4)为了获得总体最大高度,我们返回max(MSH(i)),其中0 <0。我&lt; Ñ
我认为解决方案是错误的,因为它只考虑所有方框的3次旋转。要获得正确的解决方案,它应该产生6种可能的旋转。那么,给定的解决方案是不正确的,还是他们使用6次旋转的任何缺陷?
答案 0 :(得分:2)
请注意:
为简单起见,我们认为深度始终小于或等于宽度。
所以,如果一个盒子的尺寸是例如3,4和5,我们考虑以下三种方法将它放在堆叠上:
其他三个旋转的深度大于宽度,因此我们不考虑它们:
为了查看另一个a x b
是否可以完全覆盖一个矩形c x d
,只需将它们同时转为a <= b
和c <= d
,然后检查a <= c
和b <= d
。这就是它起作用的原因。
答案 1 :(得分:1)
不,只考虑每个盒子的3个“旋转”就足够了,因为唯一考虑的可能性是使盒子的顶部和底部(比如)垂直于的那个尺寸,并且那里只有3个。以这种方式考虑每个盒子的3种不同可能性可能有所帮助,而不是旋转。
重点是,在我们选择了一对盒子的顶部和底部(我们可以用3种方式做)之后,我们不需要尝试盒子的两个不同旋转飞机。我们总是可以选择(比如说)盒子比它更宽的旋转。我们怎么知道这样做我们不会错过任何可能的好解决方案?因为在任何具有比其宽度更大的盒子的解决方案中,必须存在最低的这样的盒子b,并且该盒子以及其上方的所有盒子可以安全地旋转90度。 (我们知道这样做是安全的,因为它是解决方案中最低的这样的盒子 - 所以它下面的盒子,如果有的话,本身必须比它更宽,这意味着如果我们旋转b度90度,它仍然必须适合在这个下方的盒子里面(我建议用这个代数来验证)。)我们可以继续转换解决方案中最低的比它更宽的盒子,直到没有留下来,而不用改变解决方案的高度。由于我们可以为包含一个或多个比它宽的盒子的任何解决方案做到这一点,这意味着每个盒子的质量完全等同于每个盒子更宽的一些解决方案 - 因为我们可以完全忽略以前的解决方案。