Java算法3--动态规划算法实现矩阵连乘

一、需求

1、编写用动态规划算法实现矩阵连乘的类。
2、编写一个测试类,给出矩阵链的阶,求计算该矩阵链乘积的完全加括号方式的最小代价,用二维表的形式输出各子矩阵链的最优值。

二、实现源程序

(1)算法实现类程序:

public class Matrix{
//计算最优值
public void matrixChain(int[]p, int[][]m, int [][]s)
   {
      int n=p.length-1;
      for (int i=1;i<=n;i++) m[i][i] = 0;
      for (int r=2;r<=n;r++)
         for(int i=1;i<=n-r+1;i++){
            int j=i+r-1;
            m[i][j] = 999999999;
            s[i][j] = i;
            for (int k = i; k < j; k++) {
               int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
               if (t < m[i][j]) {
                 m[i][j] = t;
                 s[i][j] = k;}
               }
            }
   }
//构造最优解
public  void TraceBack(int [][]s, int i, int j)
   { 
     if(i!=j){
     TraceBack(s,i,s[i][j]);
     TraceBack(s,s[i][j]+1,j);
     System.out.println("Multiply  A["+i+":"+s[i][j]+"] and  A["+(s[i][j]+1)+":"+j+"]");
             }
   }
// 打印加括号的最优解方案
public void OptimalParens(int[][] s,int i,int j){
    if(i==j)System.out.print("(A"+i);
    else{
           OptimalParens(s,i,s[i][j]);
           OptimalParens(s,s[i][j]+1,j);
           System.out.print(")");
        }
    }
}

(2)测试类程序:

//矩阵阶乘的测试
public class MatrixText {
    public static void main(String agrs[]) 
    {
        int[] p={30,35,15,5,10,80,25,65,40,20}; 
        int n=p.length;
        int [][]m=new int [n][n];
        int [][]s=new int [n][n];
        Matrix m1=new Matrix();
        m1.matrixChain(p, m, s);
        System.out.println("该矩阵阶乘子问题数乘的次数:");
        for(int i=1;ifor(int j=1;jif(i>j)
                {
                    System.out.print("----"+"\t");
                }
                else 
                {
                    System.out.print(m[i][j]+"\t");
                }
            }
            System.out.println();
        }
        System.out.println();
        System.out.println("该矩阵阶乘子问题数乘的次数:");
        for(int i=1;ifor(int j=1;jif(i>j)
                    {
                       System.out.print("----"+"\t");
                    }
                else
                    {
                       System.out.print(s[i][j]+"\t");
                    }
            }
            System.out.println();
        }
        System.out.println();
        System.out.println("该矩阵阶乘的最优解:");
        m1.TraceBack(s,1,n-1);
        m1.OptimalParens(s,1,n-1);
    }

}

Java算法3--动态规划算法实现矩阵连乘_第1张图片

你可能感兴趣的:(Java)