算法导论第十五章 15.2 矩阵链乘法问题 Java实现

本文介绍了如何使用Java实现矩阵链乘法的最优括号化方案。通过构建矩阵类来存储矩阵信息,并通过递归算法计算最优解。文章详细阐述了构建矩阵类、测试程序、载入方法、求最优括号化方案和两矩阵相乘的方法,最后给出了完整的代码实现。
摘要由CSDN通过智能技术生成

思路:

类似于钢条切割问题,通过把矩阵链划两块,分别求其最大乘法次数,再合并。与钢条切割问题不同点在于,钢条一米是一米,前面的一米和后面的一米价格是一样的,所以可以用一维数组来存储定长钢条切割可卖价格,已算出的情况,但是矩阵链前后矩阵是不一样的,所以要用二维数组即表来存储,已算出的情况。

所以需要实现如下几点

目录

1.构建矩阵类(用于存储行数,列数,已相乘次数,括号化方案)

2.编写测试程序(矩阵表示为矩阵类数组输入程序)

3.载入的方法(载入矩阵类数组,返回记录最优解的矩阵类)

4.求最优括号化方案的方法(载入矩阵类的二维数组,以及想算的几个矩阵的开始num1和结尾num2,可以将最优解填入二维数组的[num1][num2])

5.两矩阵相乘的方法(输入两矩阵类,返回一包含各属性的矩阵类,包括相乘次数,新矩阵行列数)

6.全部代码


1.构建矩阵类(用于存储行数,列数,已相乘次数,括号化方案)

class Matrix {
	private int line;//有几行
	private int row;//有几列	
	private int multiplyTimes;//相乘次数
	private String bracketsPlan;//括号化方案
	public Matrix(int line, int row, String bracketsPlan) {
		this.line = line;
		this.row = row;
		this.multiplyTimes = 0;		
		this.bracketsPlan = bracketsPlan;
	}
	public Matrix(int line, int row, int multiplyTimes, String bracketsPlan) {
		this.line = line;
		this.row = row;
		this.multiplyTimes = multiplyTimes;
		this.bracketsPlan = bracketsPlan;
	}
	
	public int getLine() {
		return line;
	}
	public void setLine(int line) {
		this.line = line;
	}
	
	public int getRow() {
		return row;
	}
	public void setRow(int row) {
		this.row = row;
	}
	
	public int getMultiplyTimes() {
		return multiplyTimes;
	}
	public void setMultiplyTimes(int multiplyTimes) {
		this.multiplyTimes = multiplyTimes;
	}
	
	public String getBracketsPlan() {
		return bracketsPlan;
	}
	public void setBracketsPlan(String bracketsPlan) {
		this.bracketsPlan = bracketsPlan;
	}
}

2.编写测试程序(矩阵表示为矩阵类数组输入程序)

public static void main(String[] args) {//本来matrix的复数是matrices,不过不要这么烦了
		//如何将输入的矩阵(即二维数组),转化为如下形式,写个方法很简单,这里不做赘述
		//测试行数前小后大的情况
		{
		    Matrix[] inputMatrixs = new Matrix[3];
		    inputMatrixs[0] = new Matrix(2,3,"A1");//前行后列
		    inputMatrixs[1] = new Matrix(3,5,"A2");
		    inputMatrixs[2] = new Matrix(5,7,"A3");
	    	Matrix answer = AllMatrixsMutiply(inputMatrixs);
	    	System.out.println("答案矩阵行数: "+answer.getLine());
	    	System.out.println("答案矩阵列数: "+answer.getRow());
	    	System.out.println("答案矩阵最优括号化方案: "+answer.getBracketsPlan());
	    	System.out.println("答案矩阵最少乘法次数: "+answer.getMultiplyTimes());
	    	System.out.println();
		}
		
		//测试行数大小有反复的情况
		{
			Matrix[] inputMatrixs = new Matrix[5];
			inputMatrixs[0] = new Matrix(100,3,"A1");
			inputMatrixs[1] = new Matrix(3,5,"A2");
			inputMatrixs[2] = new Matrix(5,7,"A3");
			inputMatrixs[3] = new Matrix(7,11,"A4");
			inputMatrixs[4] = new Matrix(11,13,"A5");
			Matrix answer = AllMatrixsMutiply(inputMatrixs);
			System.out.println("答案矩阵行数: "+answer.getLine());
			System.out.println("答案矩阵列数: "+answer.getRow());
			System.out.println("答案矩阵最优括号化方案: "+answer.getBracketsPlan());
			System.out.println("答案矩阵最少乘法次数: "+answer.getMultiplyTimes());//手算可得正确答案是4665
			System.out.println();
		}
		
		//测试行数大小有反复的情况
		{
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值