Expm5_2 矩阵连乘问题
给定n个矩阵{A1,A2,…,An},其中AiAi+1是可乘的,i=1,2,…,n-1,考察这n个矩阵的连乘积A1A2…An,
设计一个动态规划算法,求出这个矩阵连乘积问题的最优计算顺序。
1 public class Exp5_2 { 2 //矩阵连乘问题 3 public static void main(String[] args) { 4 int n=4; 5 String[] matrixName=new String[]{"A","B","C","D"}; 6 int[] m=new int[]{50,20,1,10,100}; 7 int[][] c=new int[n][n]; 8 int[][] minPoint=new int[n][n]; 9 int minCount=matrixMultiply(m, n, c, minPoint); 10 System.out.println("需要计算最小乘法次数为: "+minCount); 11 System.out.print("计算顺序为:"); 12 printChain(0, n-1, matrixName, minPoint); 13 } 14 15 //m为每个矩阵的维数,n为矩阵个数,c为计算Ai*Aj的最小代价,minPoint为Ai*Aj最小代价的分开点 16 public static int matrixMultiply(int[] m,int n,int[][] c,int[][] minPoint){ 17 18 for(int i=0;i<=n-1;i++) //单一矩阵,不需要进行乘法运算,所以置为0 19 c[i][i]=0; 20 21 for(int s=2;s<=n;s++){ //s为矩阵连乘的个数 22 for(int i=0;i<=n-s;i++){ //i表示矩阵连乘中的第一个 23 24 int j=i+s-1; //j表示矩阵连乘中的最后一个 25 c[i][j]=Integer.MAX_VALUE; 26 27 for(int k=i;k<=j-1;k++){ //计算Ai*Aj最小代价中的k值 28 int temp=c[i][k]+c[k+1][j]+m[i]*m[k+1]*m[j+1]; 29 if(temp<c[i][j]){ 30 c[i][j]=temp; 31 minPoint[i][j]=k; 32 } 33 }//内for 34 35 }//中for 36 }//外for 37 return c[0][n-1]; 38 } 39 40 public static void printChain(int i,int j,String[] matrixName,int[][] minPoint){ 41 if(i==j) 42 System.out.print(matrixName[i]); 43 else{ 44 System.out.print("("); 45 46 printChain(i,minPoint[i][j],matrixName,minPoint); 47 printChain(minPoint[i][j]+1,j,matrixName,minPoint); 48 49 System.out.print(")"); 50 } 51 } 52 53 }

浙公网安备 33010602011771号