题目描述
使用动态规划算法求解矩阵连乘问题,输出最少乘法次数。
输入
每组数据包括两行,第一行为数组长度n,第二行为存储矩阵维数的一维数组。
输出
矩阵连乘最优计算次数。
样例输入
7
30 35 15 5 10 20 25
样例输出
15125
代码实现
import java.util.Scanner;
public class Main {
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];
//对角线填写,矩阵链为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];
//遍历所有可能的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;
}
}
}
System.out.println(m[1][a]);
}
sc.close();
}
}
时间复杂度O(n3),三层嵌套for循环。空间复杂度O(n2),填了一张n*n的表。