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)}