Динамическое программирование для минимальных затрат

77
5

У меня вопрос с ячейкой. Есть русские города. Мы хотим построить ячейку в некоторых городах. Каждая ячейковая башня может покрыть себя и своего соседа. В каждом городе есть стоимость строительства ячеистой башни. Мы хотим узнать минимальные затраты на строительство ячеистой башни, чтобы охватить все города.


Например,


(1)


ГОРОД 1 2 3


СТОИМОСТЬ 5 1 2
Мы выбираем построить ячеистую башню в городе-2. Стоимость: 1.


(2)


ГОРОД 1 2 3 4


СТОИМОСТЬ 5 1 2 3
Мы выбираем построить ячеистую башню в городе-2/3. Стоимость 1 + 2 = 3.


(3)


ГОРОД 1 2 3 4


СТОИМОСТЬ 5 1 3 2


Мы выбираем построить ячеистую башню в городе-2/4. Стоимость 1 + 2 = 3.


Это динамический алгоритм программирования. Как я могу его решить?


Спасибо
Ling

спросил(а) 2021-01-25T22:55:24+03:00 5 месяцев назад
1
Решение
63

Я бы пошел с чем-то из следующих строк:


f(0,_) = 0
f(1,true) = 0
f(1,false) = cost[1]
f(x,true) = min{ f(x-1,true) + cost[x], f(x-1,false) }
f(x,false) = min { f(x-1,true) + cost[x], f(x-2,true) + cost[x-1]}

Идея такова:

x - текущее число города, на которое мы смотрим, и логическое значение истинно, если этот город уже покрыт (городом слева).


    f(0,_) - это пустое базовое предложение - оно может свободно покрывать ничего.
    f(1,false) является базой, где город 1 не покрыт, поэтому вы должны поставить там башню, а f(1,true) - это база, где закрыт город 1, поэтому вам не нужна башня, и вы закончили.
    f(x,true) - это тот случай, когда город x уже закрыт, поэтому вы можете поставить там башню и продолжить следующий город (который также покрыт - f(x-1,true)), или не ставьте там башню, и следующий город не покрыт [f(x-1,false)]
    f(x,false) - это случай, когда город x не покрыт, поэтому у вас в основном есть два варианта, или установите там башню, а затем продолжайте f(x-1,true). Или поместите башню в следующий город (в x-1), а затем продолжайте f(x-2,true)

Начните с f(x,false), где x - последний город, и вы получите минимальное решение.
Легко видеть, что эту рекурсивную формулу легко можно модифицировать до DP.

ответил(а) 2021-01-25T22:55:24+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема