10776. Путешествие на машине

 

Имеются n городов. Вы хотите поехать из города 1 в город n на машине. Для этого нужно купить бензин. Как известно, один литр бензина в k - ом городе стоит costk. Изначально Ваш топливный бак пуст, и Вы расходуете один литр бензина на километр. Города расположены на одной линии в порядке возрастания, причем k - ый город имеет координату xk. Также необходимо заплатить tollk, чтобы въехать в k - ый город. Ваша задача – совершить поездку с минимально возможной стоимостью.

 

Вход. Первая строка содержит количество городов n (1 ≤ n ≤ 1000).

Вторая строка содержит n координат городов x1, ..., xn. Координаты уникальны и отсортированы, xi < xi+1 для каждого i = 1, 2, ..., n – 1.

Третья строка содержит n целых чисел – стоимости бензина cost1, ..., costn.

Четвертая строка содержит n целых чисел – въездные пошлины toll1, ..., tolln.

Известно, что координаты городов, стоимость бензина и въездные пошлины – неотрицательные целые числа, не превышающие 109.

 

Выход. Выведите минимально возможную стоимость поездки.

 

Пример входа

Пример выхода

5

1 4 5 8 10

6 8 2 4 6

7 2 5 4 7

53

 

 

РЕШЕНИЕ

динамическое программирование

 

Анализ алгоритма

Пронумеруем города от 0 до n – 1. Пусть dpi содержит минимальную стоимость поездки до города i. Тогда dp0 = toll0 (для попадания в нулевой город достаточно заплатить только въездную пошлину).

Предположим, что для приезда в i-ый город мы заправились в j-ом городе и поехали в i-ый напрямую. Тогда для совершения этого переезда на бензин следует потратить costj * (xjxi) денег. Для въезда в i-ый город следует заплатить пошлину tolli. Стоимость проезда с первого до j-го города равна dpj. Город j следует выбрать таким образом, чтобы минимизировать стоимость поездки. Отсюда имеем:

 

Пример

Рассмотрим приведенный пример.

dp0 = toll0 = 7,

dp1 = toll1 + cost0 * (x1x0) + dp0 = 2 + 6 * (4 – 1) + 7 = 27,

dp2 = toll2 + min(cost0 * (x2x0) + dp0, cost1 * (x2x1) + dp1) =

5 + min(6 * (5 – 1) + 7, 8 * (5 – 4) + 27) = 5 + min(31, 35) = 36

dp3 = toll3 + min( cost0 * (x3x0) + dp0,

                             cost1 * (x3x1) + dp1,

                             cost2 * (x3x2) + dp2) =

4 + min(6 * (8 – 1) + 7, 8 * (8 – 4) + 27, 2 * (8 – 5) + 36) =

4 + min (49, 59, 42) = 46

 

Реализация алгоритма

Читаем входные данные.

 

scanf("%d", &n);

x.resize(n);

for (i = 0; i < n; i++)

  scanf("%d", &x[i]);

cost.resize(n);

for (i = 0; i < n; i++)

  scanf("%d", &cost[i]);

toll.resize(n);

for (i = 0; i < n; i++)

  scanf("%d", &toll[i]);

 

Инициализируем массив dp.

 

dp.resize(n);

dp[0] = toll[0];

 

Последовательно вычисляем значения dp1, dp2, …, dpn-1.

 

for (i = 1; i < n; i++)

{

 

В переменной cst вычисляем

 

  long long cst = INF;

  for (j = 0; j < i; j++)

    cst = min(cst, cost[j] * (x[i] - x[j]) + dp[j]);

  dp[i] = toll[i] + cst;

}

 

Выводим ответ.

 

printf("%lld\n", dp[n - 1]);