Проблема: У нас есть массив размером n
и мы разрешено выполнять в большинстве K
операций, где каждая операция может бытьРасчет ожидаемого числа инверсий в изменяющемся массиве
- уменьшить количество инверсии на 1.
- сделать случайную перетасовку всего массива.
Моя проблема заключается в выполнении операций K
таким образом, чтобы ожидаемое количество инверсий в конечном массиве было сведено к минимуму.
Ограничения:
100е testcases с
н K < N (N-1)/2
Мой подход: Я имею в виду динамическое программирование решение. Я могу рассчитать вероятности наличия точно e
инверсий в массиве размером n
с использованием чисел махонов. Я также заполняю массив dp[k+1][1+n(n-1)/2]
row wise, так что dp[i][j]
обозначает минимальные ожидаемые инверсии в массиве с j
инверсиями после выполнения i
операций, а затем с его использованием я могу сгенерировать минимальное ожидаемое значение для операции (i+1)<sup>th</sup>
для всех возможных инверсий в массиве.
Проблема с этим подходом Вероятности неточны из-за ограничения удвоений в C++, и этот алгоритм равен O(kn<sup>2</sup>)
для каждого тестового примера, который очень медленный.
Например:
Вероятность не имеющая инверсии в массиве размера 100 = 1.0/factorial(100)
~ 10<sup>-160</sup>
(я думаю, что есть отсутствие точности здесь).
Я думаю, что есть некоторый точный и эффективный подход. Пожалуйста, предложите несколько идей.
Спасибо
Для операции № 2 вы имеете в виду случайную перетасовку смежного подмассива, т. Е. Подматрицу всех элементов с индексами между i и j, где 1 <= i
user2566092
@ user2566092 Это случайная перетасовка всего массива – v78
@userDD На самом деле, я думаю, что я ошибался, если массив большой, а число операций невелико, тогда, вероятно, лучше не допустить случайного перетасовки массива, пока вы не получите достаточно малое число инверсий просто случайно, а затем, как только вы это сделаете, вы закончите, уменьшив количество инверсий на 1 для остальных операций. – user2566092