Все темы
120

Самый дешёвый порядок слияния

Tier 1Закрыто

Где применяется

1. Задача

Программа уплотнения логов держит отсортированные сегменты в ряд. Она сливает их по два, пока не останется один. Слияние двух сегментов стоит сумму их размеров: каждую запись из обоих приходится прочитать и записать заново. Есть ограничение. Сливать можно только соседние сегменты, и их порядок менять нельзя.

От порядка слияний зависит общая стоимость. Если первой слить не ту пару, большой сегмент потом пройдёт через лишние слияния. По размерам сегментов нужно найти самую дешёвую общую стоимость, чтобы свести их в один.

Первое, что приходит в голову: каждый раз сливать соседнюю пару с самой маленькой суммой. Здесь это правило иногда проигрывает. Возьми размеры [3, 3, 2, 4]. Самая лёгкая пара это 3 и 2 (сумма 5). После неё остаётся [3, 5, 4], дальше 3 + 5 = 8 и в конце 12. Итого 5 + 8 + 12 = 25. Если начать с 3 + 3 = 6, потом слить 2 + 4 = 6, а в конце 6 + 6 = 12, выйдет 24. Поэтому жадное правило здесь не годится.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит
Самый дешёвый способ слить кучи в ряд
minMergeCost([4, 1, 3, 2])
sizes
4
1
3
2
dp[i][j]: минимальная цена слить кучи i..j в одну
j=0j=1j=2j=3
i=00
i=10
i=20
i=30

Сливаем соседние кучи, пока не останется одна. Каждое слияние стоит суммы размеров двух куч. Ищем самый дешёвый порядок.

Как узнать

DP на интервалах (DP on intervals)

Эти слова в условии значат этот паттерн

  • объединить соседние части с некоторой стоимостью
  • лучший способ разбить отрезок на две части
  • порядок перемножения цепочки матриц
  • стоимость слияния зависит от всего отрезка
  • оптимальная расстановка скобок или порядок построения

Похоже, но не то

n примерно до 500 даёт O(n в кубе). Отрезков n в квадрате, и у каждого n точек разреза.

На LeetCode

Задачи, где ряд сливают, режут или лопают в каком-то порядке, и от порядка зависит стоимость. Для отрезка от i до j перебирай каждую точку разреза k, складывай две половины и цену этого шага и заполняй таблицу по длине отрезка.

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности