TLDR:
Вы ищете количество инверсий в массиве для сортировки по убыванию. Это выполнимо в O(n lg n)
.
. Число инверсий в массиве A
определяется как число всех пар индексов i
, j
, таких как i < j
и * 1009. *. Таким образом, в основном количество пар значений в A
, такое, что первое будет появляться после второго, если будет A
отсортировано. Это можно рассчитать, пройдя все значения в A
и посчитав предшествующие значения, которые должны прийти после:
count_inversions(A):
count = 0
for i=0 to length of A - 1:
for j=0 to i - 1:
if A[i] > A[j]:
count++
return count
Для вашей задачи наивное решение будет очень похоже:
total_delete_cost(A):
count = 0
for i=0 to length of A - 1:
for j=0 to i - 1:
if A[i] < A[j]:
count++
return count
Единственное, что изменилось, это строка if A[i] > A[j]
. Или с другой стороны: каждое значение x
в A
добавит m
к общей стоимости, где m
- это число значений, которые больше x
и имеют более высокий индекс. Это точно количество инверсий для обратного порядка от A
.
С этого момента на оставшуюся часть вопроса дается ответ здесь , за исключением незначительной адаптации для перехода от возрастания к убыванию, поэтому я не буду публиковать код для решения оставшейся части проблема.