Решение можно найти по адресу - http://codeforces.com/blog/entry/364
Это говорит -
Обратите внимание, что существует неубывающая последовательность, которая может быть получена из данной последовательности с использованием минимального числаходов и в котором все элементы равны некоторому элементу из начальной последовательности (т.е. который состоит только из чисел из начальной последовательности).
PROOF -
Предположим, что оптимальной последовательности не существуетгде каждый элемент равен некоторому элементу из начальной последовательности.Тогда есть элемент i, который не равен ни одному из элементов {ai}.Если элементы с номерами i-1 и i + 1 не равны элементу i, то мы можем переместить его ближе к ai, и ответ уменьшится.Таким образом, существует блок равных элементов, и все они не равны ни одному из элементов исходной последовательности.Обратите внимание, что мы можем увеличить весь блок на 1 или уменьшить его на 1, и одно из этих действий не увеличит ответ, поэтому мы можем перемещать этот блок вверх или вниз, пока все его элементы не будут равны какому-либо элементу из начальной последовательности.
АЛГОРИТМ -
Предположим, {ai} - это начальная последовательность, {bi} - та же самая последовательность, но в которой все элементы различны, и они отсортированы от наименьшего к наибольшему.Пусть f (i, j) - минимальное число ходов, необходимое для получения последовательности, в которой первые элементы i неубывающие, а i-й элемент не больше bj.В этом случае ответ на задачу будет равен f (n, k), где n - длина {ai}, а k - длина {bi}.Мы вычислим f (i, j), используя следующие повторения:
f(1,1)=|a1-b1|
f(1,j)=min{|a1-bj|,f(1,j-1)}, j>1
f(i,1)=|ai-b1|+f(i-1,1), i>1
f(i,j)=min{f(i,j-1),f(i-1,j)+|ai-bj|}, i>1, j>1
Сложность O (N2).Чтобы избежать ограничения памяти, следует помнить, что для вычисления f (i, ) вам нужно знать только f (i-1, ) и ту часть i-й строки, которая уже вычислена.