Algorithm 求K逆置换的总数

Algorithm 求K逆置换的总数,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我得到了号码N。我必须找到所有的数字排列1..N,这样数组中的反转总数就是K For example: (all the following permutations have exactly 2 inversions) N=4 , K=2 (1,4,2,3) , (1,3,4,2) , (2,1,4,3) , (3,1,2,4) and (2,3,1,4). 我的方法: 动态规划:让dp[i][j]保持一定数量的方法,使得位置i负责j反转次数 dp[n][0]=1 for(int i=n

我得到了号码
N
。我必须找到所有的数字排列
1..N
,这样数组中的反转总数就是
K

For example: (all the following permutations have exactly 2 inversions) 
N=4 , K=2
(1,4,2,3) , (1,3,4,2) , (2,1,4,3) , (3,1,2,4) and (2,3,1,4).
我的方法:
动态规划:让
dp[i][j]
保持一定数量的方法,使得位置
i
负责
j
反转次数

dp[n][0]=1
 for(int i=n-1;i>=1;i--){

      int x = Math.min(k,n-i); // Maximum Number of inversion i position can do

      for(int j=0;j<=x;j++){

          for(int v=0;v<=j;v++){
                dp[i][j]+=dp[i+1][v];
            }

      } 
dp[n][0]=1
对于(int i=n-1;i>=1;i--){
int x=Math.min(k,n-i);//i位置可以进行的最大反转次数

对于(int j=0;j因为对于
1,2…N-1
的任何排列,我们可以在
j
位置插入
N
,加上总的
N-j
倒数,
1,2…N
k
倒数的排列总数可以通过

T(N,k) = T(N-1,k) + T(N-1,k-1) + T(N-1,k-2) ... + T(N-1,0)
JavaScript示例:

函数f(N,K){
var M=[[1]];

对于(var n=1;n@A.Sarid的可能重复项,您仍然可以改进我当前的实现吗?我也做了同样的事情,
dp[i][j]+=dp[i+1][v]
;但是当n=3,K=3时,n=2的最大反转数是1,否?因此对于T=3,我们唯一可以将其添加到T(2,1)中的地方我想,要得到3个倒数,应该在0的位置,比如:
T(2,0)={(1,2)};T(2,1)={(2,1)};T(3,3)={(3,2,1)}