请帮我找到解决这个问题的好方法。
我们有3个尺寸的方框。我们可以定位它们,我们希望将它们置于另一个之上以获得最大高度。如果2个尺寸(宽度和长度)低于下面方框的尺寸,我们可以在另一个方框的顶部放一个方框。
对于exapmle,我们有3个维度w * D * h,我们可以将其显示为(h * d,d * h,w * d,d * W,h * w,w * h) 请帮我在图论中解决它。 在这个问题上我们不能把(2 * 3)放在上面(2 * 4),因为它有相同的宽度。所以2维应该小于框
答案 0 :(得分:1)
更新(正确?但可能不是最有效的):
每个框变为3个顶点(称这些顶点相关)。获得加权DAG。修改描述的算法here 拓扑排序(忽略一些顶点相关的事实),遵循算法但不是整数数组,而是保留一个通向每个顶点的路径列表。然后,当为新顶点添加路径(wiki alg中的“w”)时,通过将路径删除到包含与w相关的顶点的v来创建引导的路径列表。 与原始算法不同,这个算法是指数式的。
原始错误答案(见评论):
每个盒子的3个表面尺寸变为3个节点。然后创建一个有向图,将每个表面连接到较小尺寸的所有表面。将每条边的价格分配给边缘所通过的节点的第三维(即高度)。现在这是找到longest path problem in a DAG的问题。
答案 1 :(得分:1)
编辑:仅当无法围绕所有轴旋转框时才有效。
如果我正确理解了这个问题,可以通过动态编程来解决。找到最大堆栈高度的简单算法是:
首先旋转所有框,使得对于Box B_i,w_i< = d_i。这需要时间O(n)。
现在根据底部区域w_i * d_i对框进行排序,并让索引显示出来。这需要时间O(n log n)。
现在B_i只有在i< j,但我< j并不意味着B_i可以在B_j上。
顶部有B_j的最大堆栈是
现在我们可以创建一个递归公式来计算最大堆栈的高度
H(j)= max(h_j,max(H(i)| i 并且通过计算max(H(j),i< = j< = n),我们得到最大堆栈的高度。 如果我们想要实际的堆栈,我们可以将一些信息附加到H函数并记住索引。