Я пытаюсь эффективно решать SPOJ Проблема 64: Перестановки.
Пусть A = [a1, a2,..., an] - перестановка целых чисел 1,2,..., n. Пара индексов (i, j), 1 <= я <= j <= n, является инверсией перестановки A, если аи > а ^. Нам даны целые числа n > 0 и k >= 0. Каково количество n-элементные перестановки, содержащие точно k инверсий?
Например, число 4-элементных перестановок с ровно 1 инверсия равна 3.
Чтобы упростить просмотр данного примера, вот три 4-элементные перестановки с точностью до 1 инверсии:
(1, 2, 4, 3)
(1, 3, 2, 4)
(2, 1, 3, 4)
В первой перестановке 4 > 3, а индекс 4 меньше индекса 3. Это - единственная инверсия. Так как перестановка имеет ровно одну инверсию, это одна из перестановок, которые мы пытаемся подсчитать.
Для любой заданной последовательности из n элементов число перестановок факториально (n). Таким образом, если я использую грубую силу n 2 способ подсчета числа инверсий для каждой перестановки, а затем, проверяя, равны ли они k, решение этой проблемы будет иметь временную сложность O ( n! * n 2).
Предыдущие исследования
Подзадача этой проблемы ранее задавалась здесь в StackOverflow. Было задано решение O (n log n) с использованием сортировки слиянием, которое подсчитывает количество инверсий в одной перестановке. Однако, если я использую это решение для подсчета количества инверсий для каждой перестановки, я все равно получаю временную сложность O (n! * N log n), которая по-прежнему очень высока, по моему мнению.
Этот точный вопрос также был задан ранее в Stack Overflow, но он не получил ответов.
Моя цель - избежать факторной сложности, возникающей при повторении всех перестановок. В идеале я хотел бы получить математическую формулу, которая даст ответ на это для любых n и k, но я не уверен, что даже существует.
Если нет математической формулы для решения этой проблемы (что я вроде сомневаюсь), то я также видел, что люди дают подсказки о том, что возможно эффективное решение динамического программирования. Используя DP или другой подход, я бы очень хотел сформулировать решение, которое более эффективно, чем O (n! * N log n), но я не уверен, с чего начать.
Любые подсказки, комментарии или предложения приветствуются.
EDIT: я ответил на нижеприведенную проблему с помощью DP-подхода к вычислению числа Mahonian.