ボックス スタッキング問題の動的計画法の解決策を理解しています。これは、下のボックスが常に小さくなるように、任意の方向に回転できるボックスの特定のセットによって形成できるスタックの最大長を見つけようとするものです。スタックでより高いボックスと比較して、幅と長さが異なります。
ただし、すべてのボックスに 3 つの方向のみが必要な理由を理解できませんでした。私によると、方向の数は 6 である必要があります。つまり、高さと見なされる 3 つの次元のそれぞれについて、2 つの組み合わせが必要です。
オンラインリソースでは、元のボックスの 3 つの方向 (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} の場合、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
余分な 3 つの組み合わせは、高さを同じに保ちながら長さと幅を交互に変えているためだと理解しています。したがって、私は 1 2 3 と 1 3 2 を異なるものと見なしますが、元のアルゴリズムはそれらを同じと見なします。
ただし、この問題では、h、l、w と h、w、l は、l=3、w=4、h=5 というボックスをボックスの上に積み重ねることができるため、2 つの別々の向きとして扱う必要があると思います。l=4,w=5 ,h=6 としますが、ボックスの上ではありませんl =5,w=4 ,h=6