题目描述
使用动态规划算法求解矩阵连乘问题。
输入
每组数据包括两行,第一行为数组长度n,第二行为存储矩阵维数的一维数组。
输出
矩阵连乘最优计算次序。
样例输入
7
30 35 15 5 10 20 25
样例输出
A[2:2] * A[3:3]
A[1:1] * A[2:3]
A[4:4] * A[5:5]
A[4:5] * A[6:6]
A[1:3] * A[4:6]
代码实现
import java.util.Scanner;
public class Main {
public static void Fun(int s[][],int i,int j) {
if(i==j)
return ;
//s[i][j]存放最佳断点k
Fun(s, i, s[i][j]);
Fun(s, s[i][j]+1, j);
System.out.println("A[" + i + ":" + s[i][j]+ "] * A[" + (s[i][j]+1) + ":" +j+ "]");
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int p[] = new int[1001];
for(int i=1;i<=n;i++)
p[i] = sc.nextInt();
//定义数组数量
int a = n-1;
//定义一个数组来存放i到j矩阵相乘的最小次数
int m[][] = new int[101][101];
//存放最佳断开点k
int s[][] = new int[101][101];
//对角线填写,矩阵链为1,乘数0次
for(int i=1;i<=a;i++)
m[i][i] = 0;
//定义矩阵链的长度
for(int r=2;r<=a;r++) {
//随着长度的增加,终点向上浮动
for(int i=1;i<=a-r+1;i++) {
//在i这行,固定长度时的固定列
int j = i+r-1;
//在i处断开
m[i][j] = m[i+1][j] + p[i]*p[i+1]*p[j+1];
s[i][j] = i;
//遍历所有可能的k值,断开点
for(int k=i+1;k<j;k++) {
int t = m[i][k] + m[k+1][j] + p[i]*p[k+1]*p[j+1];
//判断最小乘法数
if(t<m[i][j]) {
m[i][j] = t;
//条件成立才是最佳断点
s[i][j] = k;
}
}
}
}
Fun(s,1,a);
}
sc.close();
}
}