思路:
类似于钢条切割问题,通过把矩阵链划两块,分别求其最大乘法次数,再合并。与钢条切割问题不同点在于,钢条一米是一米,前面的一米和后面的一米价格是一样的,所以可以用一维数组来存储定长钢条切割可卖价格,已算出的情况,但是矩阵链前后矩阵是不一样的,所以要用二维数组即表来存储,已算出的情况。
所以需要实现如下几点
目录
1.构建矩阵类(用于存储行数,列数,已相乘次数,括号化方案)
4.求最优括号化方案的方法(载入矩阵类的二维数组,以及想算的几个矩阵的开始num1和结尾num2,可以将最优解填入二维数组的[num1][num2])
5.两矩阵相乘的方法(输入两矩阵类,返回一包含各属性的矩阵类,包括相乘次数,新矩阵行列数)
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();
}
//测试行数大小有反复的情况
{