盒子堆叠没有重复

时间:2013-03-08 19:00:30

标签: algorithm dynamic-programming np

您将获得一组n种类型的矩形3-D盒子,其中第i个盒子具有高度h(i),宽度w(i)和深度d(i)(所有实数)。你想要创建一个尽可能高的盒子堆叠,但如果下盒子的2-D底座的尺寸都严格大于2的盒子,你只能在另一个盒子的顶部堆叠一个盒子。高架子的D基座。当然,您可以旋转一个框,以便任何一侧作为其基础。您不能在盒子上使用多个实例。

这个问题已在SO(Box stacking problem)上被问到,但没有“没有重复”的限制。 我们如何使用LIS解决此问题。

我设计了以下解决方案,可以进行辩论

H[j] = max(H[j],max(H[i]|i<j, D[j] < D[i] , W[j]<W[i]+ H[j] -H[j'] )
  

其中h [j']只是第j个框已经习惯了   计算H [i]。由于允许旋转,H [j]可以是宽度或   jth box的深度

2 个答案:

答案 0 :(得分:0)

此结果最初是针对2D情况导出的,但仍适用于3D框,如最后所述。

如果最佳塔架中的所有箱子都是或者可以与它们的长尺寸E-W对齐将是方便的。

假设一组具有最佳塔的盒子,其需要一些(非零)数量的盒子朝向E-W和N-S。旋转这样的塔,使最底部的盒子与E-W对齐。现在考虑最低的盒子i,它是对齐的N-S。显然,盒子i的长尺寸小于其支架盒i-1的最小尺寸;所以盒子i的长尺寸小于盒子i-1的长尺寸。

同样,由于盒子i的短维度小于盒子i的长维度,通过传递性我们知道盒子i的短维度小于盒子i-1的短维度。因此,从盒子i向上的整个子塔可以旋转90度以对准盒子E-W。

当我们登上塔时重复,显然所有箱子都可以在任何最佳塔架中对齐E-W。

因此,每个盒子在最佳塔中只有这些可能的“方向”:

  • 面向高度:最长尺寸垂直,第二长度导向E-W;
  • 面向长度:最长尺寸E-W,第二长尺寸垂直;
  • 面向宽度:最长尺寸E-W,第二长尺寸导向N-S;
  • 缺席。

答案 1 :(得分:-1)

您可以在the link you provided中使用DP解决方案,并通过在每个位置使用大小为n的位图来消除“无重复”约束。

这听起来像您计划的解决方案,但我不太关注您的公式或代码。

每个框的索引在它的3个旋转之间是通用的,并且位图的位用于框的索引,以确保不会处理同一个框的下一个旋转。

for i = 1:n  
  Box b = inputi  
  (h3i  , w3i  , d3i  ) = getRotation1(b)  
  (h3i+1, w3i+1, d3i+1) = getRotation2(b)  
  (h3i+2, w3i+2, d3i+2) = getRotation3(b)  
  index3i = index3i+1 = index3i+2 = i

// sort the 4 fields simultaneously (hi, wi, di, indexi all belong to the same box)
// (easy to do in OOP by storing these 4 in the same object)
sortByAreaDesc(h, w, d, index)

H[0] = 0
bitmap0 = {false}

for j = 1:3n
  H[j] = maxi < j, wi > wj, di > dj { if (bitmapj[ indexi ]) 0 else H[i] } + hj  
  bitmapj = bitmapi from max
  bitmapj[ indexi from max ] = true

return maxj H[j]

占用O(n 2 )的时间和空间。