Box Stacking(DP)算法中框的转数是3还是6?

时间:2015-10-10 18:56:24

标签: algorithm big-o dynamic-programming greedy lis

我理解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

1 个答案:

答案 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种配置。