Nombre de n-élément de permutations avec exactement k inversions

Je suis en train d'essayer de résoudre efficacement les SPOJ Problème 64: Permutations.

Let A = [a1,a2,...,an] une permutation des entiers 1,2,...,n. Une paire
d'indices (i,j), 1<=i<=j<=n, est une inversion de la permutation d'Un si
ia>aj. Nous sont donnés des entiers n>0 et k>=0. Quel est le nombre de
n-élément permutations contenant exactement k inversions?

Par exemple, le nombre de 4 éléments de permutations avec exactement 1
l'inversion est égal à 3.

Pour prendre l'exemple donné plus facile à voir, voici les trois 4-élément de permutations avec exactement 1 inversion:

(1, 2, 4, 3)
(1, 3, 2, 4)
(2, 1, 3, 4)

Dans la première permutation, 4 > 3 et l'indice de 4 est inférieur à l'indice de 3. C'est une simple inversion. Depuis la permutation a exactement une inversion, il est l'un des permutations que nous essayons de compter.

Pour chaque séquence de n éléments, le nombre de permutations est factoriel(n). Donc si j'utilise la force brute, n2 la façon de compter le nombre d'inversions pour chaque permutation et puis de vérifier pour voir si ils sont égaux à k, la solution à ce problème aurait le temps de complexité O(n! * n2).


La Recherche Précédente

Un subproblem de ce problème a été déjà demandé ici sur StackOverflow. Un O(n log n) solution à l'aide de fusion de tri a été faite, qui compte le nombre d'inversions dans un unique permutation. Cependant, si j'utilise cette solution pour compter le nombre d'inversions pour chaque permutation, je voudrais encore une fois la complexité de O(n! * n log n), qui est encore très élevé à mon avis.

Ce exact question a aussi été posée précédemment sur un Débordement de Pile, mais elle n'a pas reçu de réponses.


Mon objectif est d'éviter la complexité factorielle qui vient d'itérer sur toutes les permutations. Idéalement, je voudrais une formule mathématique qui donne la réponse à cette pour tout n et k, mais je ne suis pas sûr si l'un existe même.

Si il n'y a pas de mathématiques formule pour résoudre ce (que je doute) puis j'ai aussi vu des gens donner des conseils que l'efficacité de la programmation dynamique solution est possible. À l'aide de la photographie ou d'une autre approche, j'aimerais vraiment trouver une solution qui est plus efficace que O(n! * n log n), mais je ne suis pas sûr où commencer.

Tous les conseils, commentaires, ou suggestions sont les bienvenus.

EDIT: j'ai répondu au problème ci-dessous avec une approche DP à l'informatique Mahonian numéros.

  • Le fait que cela a plus de 1.4 k vues et seulement dix upvotes est stupéfiant, l'excellence de la recherche sur tous les comptes, +1
InformationsquelleAutor Shashank | 2013-10-15