SPOJ Problem 64: Permutationsを効率的に解決しようとしています。
A = [a1,a2,...,an] を整数 1,2,...,n の順列とする。インデックス (i,j) のペア、1<=i<=j<=n は、ai>aj の場合、順列 A の反転です。整数 n>0 および k>=0 が与えられます。正確に k 回の反転を含む n 要素置換の数は?
たとえば、反転が 1 つだけの 4 要素順列の数は 3 に等しくなります。
与えられた例を見やすくするために、正確に 1 つの反転を持つ 3 つの 4 要素順列を次に示します。
(1, 2, 4, 3)
(1, 3, 2, 4)
(2, 1, 3, 4)
最初の順列では、4 > 3 であり、4 のインデックスは 3 のインデックスよりも小さいです。これは単一の反転です。順列にはちょうど 1 つの反転があるため、数えようとしている順列の 1 つです。
n 要素の任意のシーケンスについて、順列の数は factorial(n) です。したがって、各順列の反転の数をカウントし、それらが k に等しいかどうかを確認するというブルート フォース n 2の方法を使用すると、この問題の解決策の時間計算量は O(n! * n 2 ) になります。
これまでの研究
この問題の副次的問題は、以前ここStackOverflow で尋ねられました。マージソートを使用した O(n log n) ソリューションが与えられました。これは、単一の順列での反転の数をカウントします。ただし、そのソリューションを使用して各順列の反転の数をカウントすると、O(n! * n log n) の時間の複雑さが得られますが、これは私の意見では依然として非常に高いです。
この正確な質問は、以前にスタック オーバーフローでも尋ねられましたが、回答がありませんでした。
私の目標は、すべての順列を反復することから生じる階乗の複雑さを回避することです。理想的には、任意の n と k についてこれに対する答えが得られる数式が必要ですが、存在するかどうかはわかりません。
これを解決するための数式が存在しない場合 (私は疑問に思っています)、効率的な動的計画法の解決策が可能であるというヒントを与えている人々も見てきました。DP または別のアプローチを使用して、O(n! * n log n) よりも効率的なソリューションを作成したいと思っていますが、どこから始めればよいかわかりません。
ヒント、コメント、または提案は大歓迎です。
編集:マホニアン数を計算するための DP アプローチを使用して、以下の問題に回答しました。