Редактировать: Работает только в том случае, если окна нельзя вращать вокруг всех осей.
Если я правильно понимаю вопрос, его можно решить с помощью динамического программирования. Простой алгоритм определения высоты максимального стека:
Начните с поворота всех ящиков так, чтобы для Ящика B_i w_i <= d_i. Это занимает время O (n). </p>
Теперь рассортируйте поля по нижней области w_i * d_i, и пусть индексирование покажет это. Это занимает время O (n log n).
Теперь B_i можно поместить в B_j, только если i
Самый большой стек с B_j на вершине равен либо
- B_j на земле
- Стек из первых коробок j-1 с B_j сверху.
Теперь мы можем создать рекурсивную формулу для вычисления высоты максимального стека
H (j) = max (h_j, max (H (i) | i
и вычисляя max (H (j), i <= j <= n), мы получаем высоту максимального стека. </p>
Если нам нужен фактический стек, мы можем прикрепить некоторую информацию к функции H и запомнить индексы.