您的位置:首页 > 其它

算法实践篇-多矩阵乘法最优次序-动态规划

2014-03-21 15:00 477 查看
package com.dynamic;

public class MatrixChainMultiple {
private int[][]size;
private int [][]momery;
private int [][]s;
public MatrixChainMultiple(int [][]size)throws Exception{
for(int i=0;i<size.length-1;i++){
if(size[i][1]!=size[i+1][0]){
throw new Exception("size错误");
}
}
this.size=size;
momery=new int[size.length][size.length];
for(int i=0;i<momery.length;i++){
momery[i][i]=0;
}
s=new int[size.length][size.length];
}

public int matrixChainOrder(){
return innerMatrixChainOrder(0,size.length-1);
}

private int innerMatrixChainOrder(int i,int j){
if(i==j||momery[i][j]>0){
return momery[i][j];
}
int tmp=Integer.MAX_VALUE;
for(int k=i;k<j;k++){
int q=innerMatrixChainOrder(i,k)+innerMatrixChainOrder(k+1,j)+size[i][0]*size[k][1]*size[j][1];
//tmp=Math.min(tmp, innerMatrixChainOrder(i,k)+innerMatrixChainOrder(k+1,j)+size[i][0]*size[k][1]*size[j][1]);
if(q<tmp){
tmp=q;
s[i][j]=k;
}

}
momery[i][j]=tmp;
return tmp;
}

public void printSolution(){
printSolution(0,size.length-1);
}
private void printSolution(int i,int j){
if(i==j){
System.out.print("A"+i);
}else{
System.out.print("(");
printSolution(i,s[i][j]);
printSolution(s[i][j]+1,j);
System.out.print(")");
}
}

public static void main(String[] args)throws Exception {
int [][]size=new int[][]{
{30,35},
{35,15},
{15,5},
{5,10},
{10,20},
{20,25}
};
MatrixChainMultiple chain=new MatrixChainMultiple(size);
System.out.println(chain.matrixChainOrder());
chain.printSolution();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: