矩阵链乘的动态规划实现(java)

一,问题分析

参考北航的算法设计,不到半小时就可以完美理解

问题上

算法设计与分析【北京航空航天大学】_哔哩哔哩_bilibili

问题下

算法设计与分析【北京航空航天大学】_哔哩哔哩_bilibili

二,代码部分

class solution{
    //成员变量
    int len;
    int n;
    int [][]D;
    int [][]Rec;
    String[] U={"","U1","U2","U3","U4","U5","U6"};
    //动态规划成员方法
    public int CM(int[] p){
        //初始化
        this.len=p.length;//这里len默认为矩阵个数n+1
        this.n=len-1;
        this.D=new int[len][len];//这里0位默认不使用,便于理解
        this.Rec=new int[len][len];//回溯二维数组,后续使用
        for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++){
                D[i][j]=999;//初始化无穷大
            }
        }
        for(int i=1;i<=n;i++){
            D[i][i]=0;
        }
        //动态规划
        for(int l=2;l<=n;l++){
            //l为横向区间长度从小到大
            for(int i=1;i<=n-l+1;i++){
                int j=i+l-1;
                for(int k=i;k<=j-1;k++){
                    int q=D[i][k]+D[k+1][j]+p[i-1]*p[k]*p[j];
                    if(q<D[i][j]){
                        D[i][j]=q;
                        Rec[i][j]=k;
                    }
                }
            }
        }
        output(U,Rec,1,n);
        System.out.println();
        return D[1][n];
    }
    //回溯成员方法
    public void output(String []U, int [][]Rec, int i, int j){
        if (i==j){
            System.out.print(U[i]);
            return;
        }
        System.out.print("(");
        output(U,Rec,i,Rec[i][j]);
        System.out.print(")(");
        output(U,Rec,Rec[i][j]+1,j);
        System.out.print(")");
    }
    public void Table(){
        for(int i=1;i<=this.n;i++){
            for(int j=1;j<=this.n;j++){
                System.out.print(this.D[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println();
        for(int i=1;i<=this.n;i++){
            for(int j=1;j<=this.n;j++){
                System.out.print(this.Rec[i][j]+"\t");
            }
            System.out.println();
        }
    }
}
public class Matrix_Chain_Multiply {
    public static void main(String[] args) {
        int[] p={2,3,7,9,5,2,4};
        solution func=new solution();
        System.out.println("矩阵链乘所需标量乘法的最小次数为:"+func.CM(p));
        System.out.println("动态规划表格为:");
        func.Table();
    }
}

三,注意点

1,矩阵输入的是矩阵的维数,比如{2,3,7,9,5},就是2行三列,3行7列,7行九列,9行5列的四个矩阵

2,动态规划的两个表格构建,较以往的动态规划表格有所不同,倒三角的自底向上的方式

 

 3,暂时想不到了,后面再添加

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值