算法(DP):矩阵链相乘

定义:

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("");
		}	
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值