题目描述
使用动态规划算法求解矩阵连乘问题,输出最少乘法次数。
输入
每组数据包括两行,第一行为数组长度n,第二行为存储矩阵维数的一维数组。
输出
矩阵连乘最优计算次数。
样例输入 Copy
7
30 35 15 5 10 20 25
样例输出 Copy
15125
import java.util.Scanner;
public class juzhenliancheng2 {
static int m[][];
static int p[];
static int n;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
n=sc.nextInt();
p=new int[n];
m=new int[n][n];
/*
* for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { m[i][j]=0; } }
*/
for(int i=0;i<n;i++) {
p[i]=sc.nextInt();
}
int t=matrixChain(n,p,m);
System.out.println(t);
}
}
private static int matrixChain(int n,int[] p, int[][] m) {
// TODO Auto-generated method stub
int n1=n-1;//为什么是n-1呢,因为其实m数组是放第几个矩阵乘至第几个矩阵的最小次数,p有n个维数,其实是n-1个矩阵
for(int i=1;i<=n1;i++) {m[i][i]=0;}//主对角线置0,m数组从(1,1)开始放元素
for(int r=2;r<=n1;r++) {//第r行对角线
for(int i=1;i<=n1-r+1;i++) {//每条对角线从第1行到第n-r+1行
int j=r-1+i;
m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];//初始化每个m[i][j]看作最小
for(int k=i+1;k<j;k++) {
int f=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(f<m[i][j]) {//找到更小的赋给m[i][j]
m[i][j]=f;
}
}
}
}
return m[1][n1];
}
}