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 * (xj – xi)
денег. Для въезда в i-ый город следует заплатить пошлину tolli.
Стоимость проезда с первого до j-го города равна dpj. Город
j следует выбрать таким образом, чтобы минимизировать стоимость поездки. Отсюда имеем:
Пример
Рассмотрим
приведенный пример.
dp0 = toll0
= 7,
dp1 = toll1 + cost0 * (x1 – x0)
+ dp0 = 2 + 6 * (4 – 1) + 7 = 27,
dp2 = toll2 + min(cost0 * (x2
– x0) + dp0,
cost1 * (x2 – x1) + dp1) =
5 + min(6 *
(5 – 1) + 7, 8 * (5 – 4) + 27) = 5 + min(31, 35) = 36
dp3 = toll3 + min( cost0 * (x3
– x0) + dp0,
cost1
* (x3 – x1) + dp1,
cost2
* (x3 – x2) + 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]);