Algorithm 每个盒子的可能配置

Algorithm 每个盒子的可能配置,algorithm,dynamic-programming,Algorithm,Dynamic Programming,问题:给您一组n种类型的矩形三维长方体,其中第i个长方体具有高度h(i)、宽度w(i)和深度D(i)(所有实数)。您希望创建一个尽可能高的长方体堆栈,但如果下部长方体的二维基座尺寸严格大于较高长方体的二维基座尺寸,则只能将长方体堆栈在另一个长方体的顶部。当然,您可以旋转一个长方体,使任何一侧都可以作为其基础。还允许使用同一类型长方体的多个实例 解决方案:我在 1) 生成所有长方体的所有3个旋转。旋转数组的大小变为原始数组大小的3倍。为了简单起见,我们认为深度总是小于或等于宽度。 2) 按基本区域

问题:给您一组n种类型的矩形三维长方体,其中第i个长方体具有高度h(i)、宽度w(i)和深度D(i)(所有实数)。您希望创建一个尽可能高的长方体堆栈,但如果下部长方体的二维基座尺寸严格大于较高长方体的二维基座尺寸,则只能将长方体堆栈在另一个长方体的顶部。当然,您可以旋转一个长方体,使任何一侧都可以作为其基础。还允许使用同一类型长方体的多个实例

解决方案:我在

1) 生成所有长方体的所有3个旋转。旋转数组的大小变为原始数组大小的3倍。为了简单起见,我们认为深度总是小于或等于宽度。

2) 按基本区域的降序对上述生成的3n个框进行排序

3) 对盒子进行排序后,问题与LIS相同,具有以下最优子结构特性。 MSH(i)=最大可能堆叠高度,盒子i位于堆叠顶部 MSH(i)={Max(MSH(j))+高度(i)},其中j宽度(i)和深度(j)>深度(i)。 如果没有这样的j,那么MSH(i)=高度(i)

4) 为了获得整体最大高度,我们返回max(MSH(i)),其中0 我认为这个解决方案是错误的,因为它只考虑了所有盒子的3次旋转。为了得到正确的解决方案,它应该生成6个可能的旋转。那么,给定的解决方案是否不正确,或者在使用6次旋转时是否存在任何缺陷?

请注意:

为简单起见,我们认为深度总是小于或等于宽度。

这样,如果一个盒子的尺寸是例如3, 4和5,我们考虑下面的三种方法把它放在堆栈上:

  • d=3,w=4,h=5
  • d=3,w=5,h=4
  • d=4,w=5,h=3

其他三个旋转深度比宽度大,所以我们不考虑它们:

  • d=4,w=3,h=5
  • d=5,w=3,h=4
  • d=5,w=4,h=3

为了查看一个矩形<代码>一个xb<代码>,完全可以被另一个代码< CxD./C> >覆盖,就足以使它们都变为“<代码> A< P>不”,就足以考虑每个框的3个“旋转”,因为唯一的可能考虑的是<强>顶部和底部的哪个维度(比如说)垂直于的框,其中只有3个。以这种方式考虑每个盒子的3种不同可能性可能会有所帮助,而不是旋转

主要的一点是,在我们选择了盒子的哪对边是顶部和底部(我们可以用三种方式来做),我们不需要尝试盒子在平面上的两种不同旋转。我们总是可以按照盒子宽于深的旋转。我们如何知道这样做不会错过任何潜在的好解决方案?因为在任何溶液中,有一个比它宽得多的盒子,必须有一个最低的盒子b,这个盒子,加上上面的所有东西,可以安全地旋转90度。(我们知道这样做是安全的,因为它是溶液中最低的盒子——所以它下面的盒子,如果有的话,它本身必须比它深,这意味着如果我们旋转b 90度,它必须仍然适合这个较低的盒子(我建议用代数方法验证它)。)我们可以在不改变溶液高度的情况下,不断变换溶液中比宽盒子更深的最低点,直到没有剩余为止。因为我们可以对任何包含一个或多个深于其宽的盒子的溶液进行此操作,这意味着每个盒子在质量上完全等同于某个溶液,其中每个盒子的宽度大于其深,因此我们可以完全忽略前面的解