【问题标题】:Finding trinomial coefficients using dynamic programming使用动态规划查找三项式系数
【发布时间】:2020-07-18 11:57:08
【问题描述】:

我正在尝试使用动态编程实现一个函数来计算 Java 中的三项式系数。 我正在使用公式:

T(n,k)= 1 if n=0 and k=0
T(n,k)= 0 if k<-n or k>n 
T(n,k)=T(n-1,k-1)+T(n-1,k)+T(n-1,k+1)

我使用二维数组来存储所有子问题的结果。但是,我得到的特定 nk 的结果与正确答案相去甚远。这是我对该方法的实现:

public static long trinomial(int n, int k) {
    if (n == 0 && k == 0) return 1;
    if (k < -n || k > n) return 0;
    long[][] T = new long[n+1][2*n+3];
    T[0][(2*n+3)/2] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = -i; j <= i; j++) {
            T[i][j+n+1] = T[i-1][j+n] + T[i-1][j+n+1] + T[i-1][j+n+2];
        }
    }
    if (k < 0) return T[n][k+n];
    else return T[n][k];
}

我收到T(24,12) = 123286440。但是,正确答案是:287134346。 我得到T(3,3) = 6。但正确答案是1。 当我使用相同的方法在纸上计算T(3,3) 时,我得到T(3,3) = 1 但在计算机中我得到了错误的答案。没有编译错误。

【问题讨论】:

    标签: java arrays multidimensional-array dynamic-programming


    【解决方案1】:

    有更好的方法来实现该功能。三项式系数的系数三角形将是对称的,即 T(n,k)=T(n,-k)。因此,数组的列数可以与行数相同,即 n+1。并且 T(n,-k) 也可以很容易地计算出来。这是实现:

    public static long trinomial(int n, int k) {
        if (n == 0 && k == 0) return 1;
        if (k < -n || k > n) return 0;
        long[][] T = new long[n + 1][n + 1];
        T[0][0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= i; j++) {
                if (j == 0) T[i][j] = T[i - 1][j] + 2 * T[i - 1][j + 1];
                else if (j == i) T[i][j] = T[i - 1][j - 1];
                else T[i][j] = T[i - 1][j - 1] + T[i - 1][j] + T[i - 1][j + 1];
            }
        }
        if (k < 0) return T[n][Math.abs(k)];
        else return T[n][k];
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建两种方法:一种返回二维数组,即三项式三角形,第二种返回此数组中指定的系数。测试更方便。

      public static long trinomialCoefficient(long[][] triangle, int n, int k) {
          return triangle[n][triangle.length - 1 + k];
      }
      
      public static long[][] trinomialTriangle(int n) {
          // new array filled with zeros
          long[][] arr = new long[n + 1][2 * n + 1];
          // first entry
          arr[0][n] = 1;
          // iterate over the rows of the array
          // starting from the second
          for (int i = 1; i < arr.length; i++) {
              // iterate over the columns of the array
              for (int j = 0; j < arr[i].length; j++) {
                  // each entry is the sum of the three
                  // entries above it, if they exist
                  arr[i][j] = arr[i - 1][j];
                  if (j > 0)
                      arr[i][j] += arr[i - 1][j - 1];
                  if (j < arr[i].length - 1)
                      arr[i][j] += arr[i - 1][j + 1];
              }
          }
          return arr;
      }
      
      public static void main(String[] args) {
          long[][] arr = trinomialTriangle(7);
      
          // output
          System.out.println("T(4,0)=" + trinomialCoefficient(arr, 4, 0));
          System.out.println("T(5,-2)=" + trinomialCoefficient(arr, 5, -2));
          System.out.println("T(7,7)=" + trinomialCoefficient(arr, 7, 7));
      
          // output triangle
          for (int i = 0; i < arr.length; i++) {
              for (int j = 0; j < arr[i].length; j++)
                  if (arr[i][j] > 0)
                      System.out.printf("%3d ", arr[i][j]);
                  else
                      System.out.print("    ");
              System.out.println();
          }
      }
      

      输出:

      T(4,0)=19
      T(5,-2)=30
      T(7,7)=1
                                    1                             
                                1   1   1                         
                            1   2   3   2   1                     
                        1   3   6   7   6   3   1                 
                    1   4  10  16  19  16  10   4   1             
                1   5  15  30  45  51  45  30  15   5   1         
            1   6  21  50  90 126 141 126  90  50  21   6   1     
        1   7  28  77 161 266 357 393 357 266 161  77  28   7   1 
      

      另见:Convert negative index to positive index in an array (Trinomial Triangle)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        相关资源
        最近更新 更多