您将获得一组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的深度
答案 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。
因此,每个盒子在最佳塔中只有这些可能的“方向”:
答案 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 )的时间和空间。