У меня есть массив n
станций обслуживания D[]
на шоссе, так что D[i]
- это расстояние станции i
от начала шоссе.
У меня также есть ряд затрат C[]
, так что C[i]
- это стоимость обслуживания моего автомобиля на станции i
.
Мне нужно отремонтировать мою машину на первой станции, и моя машина может проехать не более 100 миль между станциями.
Какой алгоритм является наиболее эффективным, чтобы добраться от начала шоссе до конца с наименьшими затратами (мне нужно знать, на каких станциях остановиться)? Мне удалось найти жадное решение для минимизации количества остановок, но с наименьшими затратами, я думаю, DP, с оптимальной подзадачей:
bestcost[j] = min( 0<i<j bestcost[i] + C[j] s.t. D[j]-D[i] <= 100)
и иметь отдельный массив last[j]
, который содержит последнюю станцию, на которой нужно остановиться, что было бы лучшей i
из подзадачи выше.
Будет ли это правильным подходом или есть лучшее решение для Greedy / DP?
O(n)
с монотонной очередью, которая позволяет вам найти минимум вO(1)
, который является оптимальным и также имеет низкий постоянный коэффициент. Это работает даже в том случае, если запас хода вашего велосипеда непостоянен. - person Niklas B.   schedule 27.01.2014C[i]
каждый раз, когда я останавливаюсь на данной станцииi
. - person Anagha   schedule 27.01.2014C[i] > C[j] where i > j
, это то место, где вы будете останавливаться на каждой станции на дороге - person Khaled.K   schedule 27.01.2014i
, которую вы либо платите (в этом случае ваш газ заправлен, а вы платитеC[i]
), либо нет (в этом случае ваш газ не заправлен, и вы платите 0). - person Niklas B.   schedule 29.01.2014bestcost[i]
- это минимальная стоимость прибытия наD[i]
И обслуживания на станцииi
. Очевидно, вы ДОЛЖНЫ заплатитьC[i]
, если решите это сделать. Но это не означает, что этот подрезультат когда-либо использовался, поэтому, в частности, это НЕ означает, что мы используем станцию в глобально оптимальном решении. У вас есть опыт динамического программирования? - person Niklas B.   schedule 29.01.2014bestcost[j] = min( 0<i<j bestcost[i] + C[j] s.t. D[j]-D[i] <= 100)
, начиная со станции 0 .. у вас есть один путь, он линейный и детерминированный, операцияmin(bestcost[i]+C[j])
эквивалентнаmin(C[j])
- person Khaled.K   schedule 29.01.2014j
является константой, если вы вычисляетеbestcost[j]
, поэтомуmin(C[j])
вообще не имеет смысла. операцияmin(bestcost[i]+C[j])
эквивалентнаmin(C[j])
, это просто неверно, вы перебираете массивbestcost[j]
для достижимых станций и берете минимум, затем вы добавляетеC[j]
, потому что вы решили остановиться наj
. у вас есть один путь, он линейный и детерминированный. Итак, итоговый путь может выглядеть так: остановка на станции 1, пропуск станции 2, пропуск станции 3, остановка на 4, остановка на 5, пропуск 6, остановка на 7. Что вы имеете в виду линейным и детерминированным? - person Niklas B.   schedule 29.01.2014bestcost[j] = min(0<i<j bestcost[i] + C[j] s.t. D[j]-D[i] <= 100)
Если вы этого не видите, я сомневаюсь в вашей способности читать код ... - person Niklas B.   schedule 29.01.2014