【问题标题】:Find the total number of permutation with K inversions求 K 次反转的排列总数
【发布时间】:2017-01-18 22:27:15
【问题描述】:

我得到了号码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];
            }

      } 

但是我的方法给了我个人的位置倒置,我怎样才能得到全部的方法?

【问题讨论】:

标签: algorithm dynamic-programming


【解决方案1】:

因为对于1,2...N-1的任意排列,我们可以在j的位置插入N,加上N-j的反转总数,1,2...Nk反转的排列总数可能是计算方式

T(N,k) = T(N-1,k) + T(N-1,k-1) + T(N-1,k-2) ... + T(N-1,0)

JavaScript 示例:

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

  for (var n=1; n<=N; n++){
    M[n] = new Array((n-1)*n/2 + 1).fill(0);
    
    for (var k=0; k<=(n-1)*n/2; k++){
      for (var j=Math.min(k,(n-2)*(n-1)/2); j>= Math.max(0,k-n+1); j--){
        M[n][k] += M[n-1][j];
      }
    }
  }
  
  return M;
}

var res = f(5,10);

for (var i=0; i< res.length; i++){
  console.log(JSON.stringify(res[i]));
}

【讨论】:

  • 我也做过同样的事情dp[i][j]+=dp[i+1][v];但是当 N=3,K=3 它给我 0
  • 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)}
猜你喜欢
  • 1970-01-01
  • 2014-11-19
  • 2013-10-22
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2021-10-02
相关资源
最近更新 更多