|
Числа - 3
(Время: 1 сек. Память: 16 Мб Сложность: 48%)
Задача решается методом динамического программирования.
Заведём квадратную матрицу M размера N*N. В ячейке Mi,j будем хранить минимальный штраф за удаление всех чисел i-го по j-е не включительно (элементы матрицы, у которых i ≥ j, нам не будут нужны). Подсчитывать эти штрафы будем следующим образом: поскольку среди чисел между i-м и j-м какое-то (k-е) мы должны удалить последним, то переберём все k от i до j не включительно и посчитаем наименьший штраф за удаление всех чисел между i и j при условии, что k-е удаляется последним. Этот штраф равен сумме наименьших штрафов за удаление всех чисел c i по k (Mi,k), с k по j (Mk,j) и штрафа за последнее удаление - (ai+aj)∙ak. Тогда очевидно, что:
Mi,j = min i≤k≤j (Mi,k + Mk,j + (ai + aj)∙ak).
Несложно посчитать элементы матрицы с индексами, отличающимися на 1: так как удалять между соседними числами нечего, то Mi,i+1 = 0.
Осталось только вычислить все элементы матрицы (например, в порядке увеличения разности между индексами) и посмотреть на число M1,N, которое и будет ответом на задачу.
Кроме того, надо аккуратно обработать случай N=1. Вышеприведённый алгоритм для этого случая не подходит, но очевидно, что, так как удалять при N=1 нечего, то ответ здесь - 0.
| |