java语言实现(1)给定n个矩阵{A1, A2, …,An},其中,Ai与Ai+1是可乘的,计算这n个矩阵的连乘积。从中找出一种乘次数最少的计算次序。
时间: 2024-02-26 07:56:39 浏览: 109
以下是Java语言实现:
```java
public class MatrixChainMultiplication {
public static int[][] findOptimalOrder(int[] p) {
int n = p.length - 1;
int[][] m = new int[n][n];
int[][] s = new int[n][n];
for (int len = 2; len <= n; len++) {
for (int i = 0; i <= n - len; i++) {
int j = i + len - 1;
m[i][j] = Integer.MAX_VALUE;
for (int k = i; k < j; k++) {
int q = m[i][k] + m[k+1][j] + p[i] * p[k+1] * p[j+1];
if (q < m[i][j]) {
m[i][j] = q;
s[i][j] = k;
}
}
}
}
return s;
}
public static int matrixChainOrder(int[] p) {
int n = p.length - 1;
int[][] m = new int[n][n];
for (int i = 0; i < n; i++) {
m[i][i] = 0;
}
for (int len = 2; len <= n; len++) {
for (int i = 0; i <= n - len; i++) {
int j = i + len - 1;
m[i][j] = Integer.MAX_VALUE;
for (int k = i; k < j; k++) {
int q = m[i][k] + m[k+1][j] + p[i] * p[k+1] * p[j+1];
if (q < m[i][j]) {
m[i][j] = q;
}
}
}
}
return m[0][n-1];
}
}
```
其中`p`是一个长度为`n+1`的数组,表示`n`个矩阵的行列数,例如`p=[10, 20, 30, 40]`表示4个矩阵,第1个矩阵为10x20,第2个矩阵为20x30,第3个矩阵为30x40。
`findOptimalOrder()`方法返回一个`n x n`的二维数组`s`,表示最优计算次序时每个区间的分割点。例如`s[0][2]=1`表示最优次序中将`A0~A2`分成两部分,分别计算`A0~A1`和`A2`的乘积。
`matrixChainOrder()`方法返回所有矩阵相乘的最小次数。
使用示例:
```java
int[] p = {10, 20, 30, 40};
int[][] s = MatrixChainMultiplication.findOptimalOrder(p);
int minMult = MatrixChainMultiplication.matrixChainOrder(p);
System.out.println("Minimum number of multiplications: " + minMult);
System.out.println("Optimal order:");
printOptimalOrder(s, 0, p.length-2);
// 输出:
// Minimum number of multiplications: 30000
// Optimal order:
// (A0(A1A2))
```
其中`printOptimalOrder()`方法用于输出最优计算次序,实现如下:
```java
public static void printOptimalOrder(int[][] s, int i, int j) {
if (i == j) {
System.out.print("A" + i);
} else {
System.out.print("(");
printOptimalOrder(s, i, s[i][j]);
printOptimalOrder(s, s[i][j]+1, j);
System.out.print(")");
}
}
```
输出结果为`"(A0(A1A2))"`,表示最优次序为先计算`A1A2`,再计算`A0`和`A1A2`的乘积。
阅读全文