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