Вам предоставляется набор из n типов прямоугольных трехмерных блоков, где i-й блок имеет высоту h (i), ширину w (i) и глубину d (i) (все действительные числа). Вы хотите создать стопку коробок, которая будет максимально высокой , но вы можете сложить ящик только над другим, если размеры двухмерного основания нижнего ящика строго превышают размеры двухмерного основания верхнего ящика. Конечно, вы можете вращать коробку так, чтобы любая сторона функционировала как ее основа. Также допустимо использовать несколько экземпляров одного и того же типа ящика.
Источник: http://people.csail.mit.edu/bdean/6.046/dp/ . Ссылка также имеет видео для объяснения решения.
Проблема с укладкой в коробку является разновидностью проблемы LIS . Нам нужно построить стек с максимальной высотой.
Ниже приведены ключевые моменты, которые следует отметить в постановке задачи:
1) Ящик можно поместить поверх другого ящика, только если ширина и глубина верхнего помещенного ящика меньше ширины и глубины нижнего ящика соответственно.
2) Мы можем вращать боксы так, чтобы ширина была меньше глубины. Например, если есть поле с размерами {1x2x3}, где 1 — высота, 2 × 3 — основание, то возможны три варианта: {1x2x3}, {2x1x3} и {3x1x2}
3) Мы можем использовать несколько экземпляров ящиков. Это означает, что мы можем иметь два разных поворота коробки как часть нашего стека максимальной высоты.
Ниже приводится решение, основанное на решении ДП проблемы LIS .
1) Генерация всех 3 поворотов всех коробок. Размер массива вращения становится в 3 раза больше размера исходного массива. Для простоты мы рассматриваем глубину как всегда меньшую или равную ширине.
2) Сортировать сгенерированные выше 3n ящиков в порядке убывания базовой площади.
3) После сортировки блоков проблема та же, что и в LIS, с оптимальным свойством субструктуры.
MSH (i) = максимально возможная высота стека с полем i на вершине стека
MSH (i) = {Макс (MSH (j)) + высота (i)}, где j <i и ширина (j)> ширина (i) и глубина (j)> глубина (i).
Если такого j нет, то MSH (i) = высота (i)
4) Чтобы получить общую максимальную высоту, мы возвращаем max (MSH (i)), где 0 <i <n
Ниже приводится реализация вышеуказанного решения.
|
Джава
|
python3
|
Выход:
The maximum possible height of stack is 60
В вышеприведенной программе заданы поля ввода: {4, 6, 7}, {1, 2, 3}, {4, 5, 6}, {10, 12, 32}. Ниже приведены все повороты коробок в порядке убывания базовой площади.
10 x 12 x 32 12 x 10 x 32 32 x 10 x 12 4 x 6 x 7 4 x 5 x 6 6 x 4 x 7 5 x 4 x 6 7 x 4 x 6 6 x 4 x 5 1 x 2 x 3 2 x 1 x 3 3 x 1 x 2
Высота 60 получается с помощью блоков {{ 3 , 1, 2}, { 1 , 2, 3}, { 6 , 4, 5}, { 4 , 5, 6}, { 4 , 6, 7}, { 32 , 10, 12}, { 10 , 12, 32}}
Сложность времени: O (n ^ 2)
Вспомогательное пространство: O (n)
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Проблема укладки плитки
- Проблема с гайками и болтами (проблема с замком и ключом) | Набор 2 (Hashmap)
- Проблема с гайками и болтами (проблема с замком и ключом) | Комплект 1
- Проблема с черепицей
- 0-1 Рюкзак Задача | DP-10
- Задача суммы подмножеств | DP-25
- Проблема знаменитости
- Проблема с разделами | DP-18
- Проблема кувшина с использованием Memoization
- Проблема выравнивания последовательности
- Проблема раздела художника | Набор 2
- Проблема с предками уровня
- N последовательных веревочных задач
- Проблема изоморфизма деревьев
- Проблема переноса слов | DP-19
0.00 (0%) 0 votes