算法实验三: 动态规划之矩阵连乘

一、实验目的
了解动态规划法思想;
掌握动态规划算法步骤;
学会使用动态规划算法实现矩阵连乘。
二、实验内容

  1. 问题描述
    给定n个矩阵:A1,A2,…,An,其中Ai与Ai+1是可乘的,i=1,2…,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。
    输入:矩阵个数 如,3
    依次输入矩阵的行数和最后一个矩阵的列数 如10 5 15 10
    输出:最小计算量的值
  2. 要求:
    (1) 写出问题的分析过程
    (2) 写出程序代码
    (3) 贴出程序结果
    三、实验总结(写出本次实验的收获,遇到的问题等)
    代码:
public class MatrixMultipy1 {

		//作用:计算矩阵连乘时,矩阵链的最少乘次数,P:数组维度的数组,m[i][j]:最优值(最小计算量),s:最优断开位置的数组 
	     private static int matrixChain(int[] p, int[][] m, int[][] s) {
	    	 int n=p.length-1;	//矩阵链长度为1,不需要进行乘运算,即m[i][i]值为0 ,所以 n = p - 1;
	    	 for(int i=1;i<=n;i++)
	    		 m[i][i]=0;		//单个数组不需要
	    	 //矩阵结合的个数,从第i到j个矩阵进行结合。
	    	 for(int r=2;r<=n;r++) {
	    		 for(int i=1;i<=n-r+1;i++)
	    		 {
	    			 int j=i+r-1;
	    		     m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];//???计算A[i: j] = A[i: i]A[i+1: j]
	    		     s[i][j]=i;	//断点i
	    		     
	    		     //对i
	    		     for(int k=i+1;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;//记录断开位置
	    		    	 	}
	    		     }
	    		}
	    	 }
	    	 return m[1][n];
	     }

	 	//根据上面的算法计算出的断点矩阵s指示的加括号方式输出计算A[i:j]的最优计算方式
	 	 public static void traceback( int i, int j,int[][]s) {
	 			
	     	 if(i==j) {
	     		 System.out.print("A" +  i);
	     		 return;
	     	 }
	     	 //不要忘记这两个括号
	     		else {
	     			System.out.print("(");
	     			traceback(i,s[i][j],s);
	     			traceback(s[i][j]+1,j,s);
	     			System.out.print(")");
				} 
	 	 }	 	 	 	 
	     public static void main(String[]args) {
	    	// TODO Auto-generated method stub 
	    	int[] p =new int[] {30,35,15,5,10,20,25};//数组的维度,数据来源:课本
	    	int[][] m =new int[p.length + 1][p.length + 1];//次数
	    	int[][] s =new int[p.length + 1][p.length + 1];//断点
	    	System.out.println("最优值:" + matrixChain(p, m, s));
	    	System.out.print("最优计算方式:");
	    	traceback(1, p.length - 1, s);
	    	 
	     }    		     
	}


结果:
最优值:15125
最优计算方式:((A1(A2A3))((A4A5)A6))

需要改进:没有按照实验要求输入矩阵个数,而是固定了6个矩阵,且矩阵维度也是设定好的,有空改进,矩阵数目:输入,矩阵维度:随机生成。

你可能感兴趣的:(Java,算法,动态规划)