动态规划算法——矩阵连乘问题(java实现)

6 篇文章 0 订阅

矩阵连乘问题:

求矩阵A1(5×3)、A2(3×4)、A3(4×7)、A4(7×2)、A5(2×3)和A6(3×6)连乘的最佳计算次序。

 算法实现:

package practice;
/**
 * array[i][j]
 * 		表示Ai...Aj的最佳计算次序所对应的相乘次数 即存放各子问题的最优值
 * s[i][j]=k
 * 		表示Ai...Aj这(j-i+1)个矩阵中最优加括号方法为(Ai...Ak)(Ak+1...Aj),
 * 		即存放了各子问题的最优决策
 * p[i]表示Ai的行数,p[i+1]表示Ai的列数 
 * @author 光
 */
public class MatrixChain{
 
    private int array[][];  
    private int p[];  
    private int s[][];  
      
    public MatrixChain(){
    	//六个矩阵有七个数
        p=new int[]{5,3,4,7,2,3,6};  
        array=new int[6][6];  
        s=new int[6][6];  
    }  
    /**动态规划*/
    public void martixChain(){  
        int n=array.length;  
        for(int i=0;i<n;i++){
            array[i][i]=0;
        }
        for(int r=2;r<=n;r++){  		//不同规模的子问题
            for(int i=0;i<=n-r;i++){    //每一个规模为r的矩阵连乘序列的首矩阵Ai
                int j=i+r-1;  			//每一个规模为r的矩阵连乘序列的尾矩阵Aj
                // 决策为k=i的乘法次数
                array[i][j]=array[i+1][j]+p[i]*p[i+1]*p[j+1];  
                s[i][j]=i;
                for(int k=i+1;k<j;k++){ //对Ai...Aj的所有决策,求最优值,记录最优决策
                    int t=array[i][k]+array[k+1][j]+p[i]*p[k+1]*p[j];  
                    if(t<array[i][j]){  
                        array[i][j]=t;
                        s[i][j]=k;
                    }  
                }  
            }  
        }  
    }  
    /* 
     * 待求矩阵为:Ai...Aj
     */  
    public void traceBack(int i ,int j){
    	if(i<j){
    		traceBack(i,s[i][j]);
    		traceBack(s[i][j]+1,j);
    		if(i==s[i][j] && (s[i][j]+1)==j){
    			System.out.println("把A"+(i+1)+"到A"+(j+1)+"括起来");
    		}else if(i==s[i][j] && (s[i][j]+1)!=j){
    			System.out.println("把A"+((s[i][j]+1)+1)+"到A"+(j+1)+"括起来,在把A"+(i+1)+"到A"+(j+1)+"括起来");
    		}else if(i!=s[i][j] && (s[i][j]+1)==j){
    			System.out.println("把A"+(i+1)+"到A"+(s[i][j]+1)+"括起来,在把A"+(i+1)+"到A"+(j+1)+"括起来");
    		}else{
    			System.out.println("把A"+(i+1)+"到A"+(s[i][j]+1)+"括起来,在把A"+((s[i][j]+1)+1)+"到A"+(j+1)+"括起来,然后把A"+(i+1)+"到A"+(j+1)+"括起来");
    		}
    	}
    }
    public static void main(String[] args) {  
        MatrixChain m=new MatrixChain();  
        m.martixChain();
        m.traceBack(0, 5);
    }
}

 
输出结果: 

把A3到A4括起来
把A3到A4括起来,在把A2到A4括起来
把A2到A4括起来,在把A1到A4括起来
把A1到A4括起来,在把A1到A5括起来
把A1到A5括起来,在把A1到A6括起来


  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值