矩阵连乘问题 动态规划

矩阵连乘问题

  • 在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。由该公式知计算C=AB总共需要pqr次的数乘。其标准计算公式为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52HGaeO4-1639391368981)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)]

  • 给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要求计算出这n个矩阵的连乘积A1A2…An,最少的乘法次数。

  • 递归公式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3MtHQbPl-1639391368985)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif)]

public class Matrix_multiplication {// 矩阵连乘 动态规划

    public static void main(String args[]){
        int []arr = {30,35,15,5,10,20,25};
        int [][]dp = new int[7][7];//存放字符位置 i--j 最优分割位置
        MatrixChain(6,dp,arr);
        System.out.println("最佳添加括号的方式为:");
        print(1,6,dp);
    }

    static int [][]MatrixChain(int N,int dp[][],int []arr){
        int i,j,k,r;
        int [][] minNum = new int[N + 1][N + 1];
        for(i = 0;i <= N;i++){//初始化对角线,单个矩阵相乘为0
            minNum[i][i] = 0;
        }
        for(r = 2;r <= N;r++){//r个矩阵连乘 规格为r
            for(i = 1;i <= N - r + 1;i++){//保证i,j均不超过N,且可以分为子问题
                j = i + r - 1;//i --i (i + 1) -- j
                minNum[i][j] = minNum[i][i] + minNum[i + 1][j] + arr[i - 1] * arr[i] * arr[j];//划分第一个括号
                dp[i][j] = i;//假设从i到j分割第i个位置更好
                for(k = i + 1;k < j;k++){//尝试划分其它括号 i--k (k + 1) -- j
                    int temp = minNum[i][k] + minNum[k + 1][j] + arr[i - 1] * arr[k] * arr[j];
                    if(temp < minNum[i][j]){//当其它组合的乘积更小的时候
                        minNum[i][j] = temp;
                        dp[i][j] = k;
                    }
                }
            }
        }

        System.out.println("最小计算量的值为:" + minNum[1][N]);
        return dp;
    }
    static void print(int i,int j,int [][]dp){//dp[i][j]中存的是从i到j最适合分割拆分的位置
        if(i == j){//
            System.out.print("A[" + i + "]");
            return;
        }
        System.out.print("(");
        print(i,dp[i][j],dp);
        print(dp[i][j] + 1,j,dp);
        System.out.print(")");
    }
}
参考博客:

https://blog.csdn.net/weixin_44952817/article/details/110124596?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163937903916780274145649%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163937903916780274145649&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-110124596.pc_search_result_cache&utm_term=%E7%9F%A9%E9%98%B5%E8%BF%9E%E4%B9%98+%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92&spm=1018.2226.3001.4187

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值