我理解Box Stacking问题的动态编程解决方案,它试图找到可以由给定的一组盒子形成的堆栈的最大可能长度,这些盒子可以在任何方向上旋转,这样下面的盒子与堆叠中较高的框相比,宽度和长度总是较小。
但是,我还没有理解为什么每个盒子只需要3个方向。根据我的说法,方向的数量应该是6.也就是说,对于三个尺寸中的每个尺寸,你应该有两种组合。
online resource显示以下内容作为创建原始框三个方向(2个旋转)的方法。
/* Create an array of all rotations of given boxes
For example, for a box {1, 2, 3}, we consider three
instances{{1, 2, 3}, {2, 1, 3}, {3, 1, 2}} */
Box rot[3*n];
int index = 0;
for (int i = 0; i < n; i++)
{
// Copy the original box
rot[index] = arr[i];
index++;
// First rotation of box
rot[index].h = arr[i].w;
rot[index].d = max(arr[i].h, arr[i].d);
rot[index].w = min(arr[i].h, arr[i].d);
index++;
// Second rotation of box
rot[index].h = arr[i].d;
rot[index].d = max(arr[i].h, arr[i].w);
rot[index].w = min(arr[i].h, arr[i].w);
index++;
}
因此,例如,对于方框{1,2,3},三个方向将是
1 2 3
2 1 3
3 1 2
但据我说,方向应该是
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
据我所知,我的额外三种组合是由于它们之间的长度和宽度交替保持高度相同。所以,虽然我认为1 2 3和1 3 2是不同的,但原始算法认为它们是山姆。
然而,我觉得,在这个问题中,h,l,w和h,w,l应该被视为两个单独的方向,因为一个方框说l = 3,w = 4,h = 5可以堆叠在方框上方, l = 4,w = 5 ,h = 6,但不高于方框 l = 5,w = 4 ,h = 6
答案 0 :(得分:0)
你所说的绝对正确我们可以采用盒子的6个方向,但事情是我们只能用盒子的3个方向来做。
这是因为我们强加了一个给定箱子的高度,宽度和长度的规则,我们将把两个基本尺寸中较小的一个视为宽度。
换句话说,给定一个尺寸为x&gt;的盒子。 y&gt; z,我们会考虑方向:
h = x,l = y,w = z
h = y,l = x,w = z
h = z,l = x,w = y
但不是以下的方向:
h = x,l = z,w = y
h = y,l = z,w = x
h = z,l = y,w = x
这仅仅是为了简化方框的表示
即使在你指定的链接中,他们也写过,
for simplicity of solution, always keep w<=d
:
struct Box
{
// h –> height, w –> width, d –> depth
int h, w, d; // for simplicity of solution, always keep w <= d
};
现在我们已经对数据施加了这个约束,我们可以看到你原来的问题已经解决了,即
然而,我觉得,在这个问题中,h,l,w和h,w,l应该被视为两个单独的方向,因为一个方框说l = 3,w = 4,h = 5可以堆叠在一个方框上面说,l = 4,w = 5,h = 6,但不高于一个方框l = 5,w = 4,h = 6
例如,如果有两个方框
h1,w1,l1(Box1) 和
h2,w2,l2(方框2)
我们知道w1<l1
(因为我们已经施加了限制),所以如果偶然w1>w2
我们自动了解l1> w2
,那么另一个盒子配置(您说w
并且l
应该被交换并被视为单独的配置)不是必需的。
考虑一下,我相信你会明白为什么我们只使用3种配置。