К списку задач
Сложно Решено: 0 Процент решений: 0%

Разрезание прямоугольника на квадраты

Найдите минимальное количество прямых разрезов, чтобы получить только квадраты.

Чему вы научитесь

  • Задавать таблицу ДП по ширине и высоте
  • Перебирать все горизонтальные и вертикальные разрезы
  • Переиспользовать результаты для меньших прямоугольников

Условие

За один ход выберите один прямоугольник и разрежьте его полностью поперёк, параллельно одной из сторон, чтобы получить два прямоугольника с положительными целыми длинами сторон. Продолжайте, пока все части не станут квадратами. Квадраты могут быть разного размера. Считайте количество разрезов, а не количество частей.

Реализуйте функцию rectangle_cutting(height, width).

Входные данные

height: Высота исходного прямоугольника.

width: Ширина исходного прямоугольника.

Выходные данные

Верните минимальное количество разрезов.

Ограничения

1 ≤ height, width ≤ 500. Поворот прямоугольника не влияет на ответ.

Примеры

Пример 1
Ввод:
width = 3
height = 2

Ожидаемый вывод:
expected = 2
Ввод:
long long width = 3;
long long height = 2;

Ожидаемый вывод:
long long expected = 2;
Ввод:
long width = 3;
long height = 2;

Ожидаемый вывод:
long expected = 2;

Пояснение

Отрежьте квадрат 2 × 2, останется прямоугольник 2 × 1. Ещё один разрез разделит остаток на два единичных квадрата.

Пример 2
Ввод:
width = 4
height = 4

Ожидаемый вывод:
expected = 0
Ввод:
long long width = 4;
long long height = 4;

Ожидаемый вывод:
long long expected = 0;
Ввод:
long width = 4;
long height = 4;

Ожидаемый вывод:
long expected = 0;

Пояснение

Исходный прямоугольник уже является квадратом.

Как подступиться

Сначала попробуйте сами, затем открывайте подсказки по одной.

Подсказка 1

Прямоугольник можно решить, разрезав его на два меньших прямоугольника и объединив их лучшие ответы.

Подсказка 2

Переберите все возможные горизонтальные и вертикальные разрезы, чтобы найти минимум.

Подсказка 3

Полезны мемоизация или таблица, потому что многие подпрямоугольники повторяются.

Ожидаемая сложность

O(h*w*(h+w)) по времени, O(h*w) доп. памяти

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.