Там даны n веревок разной длины, нам нужно соединить эти веревки в одну веревку. Стоимость соединения двух веревок равна сумме их длин. Нам нужно соединить веревки с минимальными затратами.
Например, если нам дано 4 веревки длиной 4, 3, 2 и 6. Мы можем соединить веревки следующими способами.
1) Сначала соедините веревки длиной 2 и 3. Теперь у нас есть три веревки длиной 4, 6 и 5.
2) Теперь соедините веревки длиной 4 и 5. Теперь у нас есть две веревки длиной 6 и 9.
3) Наконец соедините две веревки, и все веревки соединились.
Общая стоимость соединения всех канатов составляет 5 + 9 + 15 = 29. Это оптимизированная стоимость для соединения канатов. Другие способы соединения веревок всегда будут иметь одинаковую или более высокую стоимость. Например, если мы сначала соединяем 4 и 6 (мы получаем три строки 3, 2 и 10), то соединяем 10 и 3 (мы получаем две строки 13 и 2). Наконец, мы соединяем 13 и 2. Общая стоимость таким образом составляет 10 + 13 + 15 = 38.
Мы настоятельно рекомендуем вам нажать здесь и попрактиковаться, прежде чем переходить к решению.
Если мы внимательно наблюдаем вышеупомянутую проблему, мы можем заметить, что длины веревок, которые выбраны первыми, включены в общую стоимость более одного раза. Поэтому идея состоит в том, чтобы сначала соединить наименьшие две веревки и повторить оставшиеся веревки. Этот подход похож на кодирование Хаффмана . Мы кладем самые маленькие веревки вниз по дереву, чтобы их можно было повторять несколько раз, а не более длинные веревки.
Ниже приведен полный алгоритм поиска минимальной стоимости подключения n веревок.
Пусть в массиве len будет храниться n веревок длин [0..n-1]
1) Создайте минимальную кучу и вставьте все длины в минимальную кучу.
2) Выполните следующие действия, пока количество элементов в куче мин не одно.
…… а) Извлечь минимум и второй минимум из минимальной кучи
…… б) Добавьте вышеупомянутые два извлеченных значения и вставьте добавленное значение в минимальную кучу.
… C) Поддерживайте переменную для общих затрат и продолжайте увеличивать ее на сумму извлеченных значений.
3) Верните значение этой общей стоимости.
Ниже приведена реализация вышеуказанного алгоритма.
|
Джава
|
C #
|
Выход:
Total cost for connecting ropes is 29
Сложность времени: временная сложность алгоритма равна O (nLogn), если предположить, что мы используем алгоритм сортировки O (nLogn). Обратите внимание, что операции с кучей, такие как вставка и извлечение, занимают O (Logn) время.
Алгоритмическая парадигма: жадный алгоритм
Простая реализация с STL на C ++
Ниже приводится простая реализация, которая использует priority_queue, доступную в STL. Спасибо Pango89 за предоставленный ниже код.
|
Джава
|
Выход:
Total cost for connecting ropes is 29
Эта статья составлена Абхишеком . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Минимальная стоимость подключения всех городов
- Минимально возможная стоимость поездки среди N городов
- Минимальная стоимость нарезки доски на квадраты
- Минимальные затраты для достижения точки N от 0 при двух разных разрешенных операциях
- Минимальная общая стоимость, необходимая для достижения последней станции
- Минимальная стоимость преобразования str1 в str2 с заданными операциями
- Минимальные затраты на обработку m задач, где затраты на переключение
- Путь минимальной стоимости с допустимым ходом влево, вправо, снизу и вверх
- Минимальная стоимость создания массива 1 путем удаления больших пар
- Минимальная стоимость приобретения всех монет с k дополнительными монетами, разрешенная с каждой монетой
- Подключите узлы на одном уровне
- Непересекающиеся линии для соединения точек по кругу
- Соединяйте узлы на одном уровне, используя постоянное дополнительное пространство
- Подключите узлы на одном уровне (уровень обхода заказа)
- Минимальная стоимость пути | ДП-6
0.00 (0%) 0 votes