定义:
1.Mij =Mi*Mi+1*Mi+2*....Mj 表示从第i个矩阵乘到第j个矩阵;
2.C[i,j]表示从第i个矩阵乘到第j个矩阵的最小的耗费相乘方式;
则Mij = Mik *M(k+1)j
3.即使用动态规划来记录每一个C[i,j],寻找C[i,j]与C[1,N]的关系,获得关系式,最终求得C[1,N]。
递推关系式:
Java代码如下:
public class MatChainMain {
public static void main(String[] args) {
//省略了定义矩阵,只是列出了所有矩阵的行数及最后一个矩阵的列组成数组r.
int[] r = {5,10,4,6,10,2};
MatChain matChain = new MatChain();
int[][] c = matChain.calculateMinValue(r);
matChain.myPrint(c);
}
}
class MatChain{
public int[][] calculateMinValue(int[] r){
int n = r.length-1;
int c[][] = new int[n][n];
//将对角线上的元素d0全设为0.
for(int i = 0;i<n;i++){
c[i][i] = 0;
}
//填充对角线d1到d(n-1).
for(int d = 1;d<=n-1;d++){
//填充对角线dd的项目,i表示行,j表示列。
for(int i = 0;i<n-d;i++){
int j = i+d;
c[i][j] = 100000;
//计算c[i][j].
for(int k = i+1;k<=j;k++){
if(c[i][j]>(c[i][k-1] + c[k][j] +r[i]*r[k]*r[j+1])){
c[i][j] = (c[i][k-1] + c[k][j] +r[i]*r[k]*r[j+1]);
}
}
}
}
return c;
}
public void myPrint(int[][] l) {
int n = l.length;
int m = l[1].length;
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
System.out.print("\t"+l[i][j]);
}
System.out.println("");
}
}
}