矩阵连乘问题

算法分析 矩阵连乘问题

矩阵连乘问题可以采用动态规划思想进行分解。要采用动态规划思想求解的问题需要满足两个条件:
1、问题需要满足最优子结构 2、子问题具有重叠性

首先,我们定义n个可以连乘的矩阵A1、A2、A3、……An,定义An的维度为p(n-1)p(n)。对于n个可以连乘的矩阵,我们可以将矩阵划分为A1-Ak的连乘S1以及Ak+1-An的连乘S2以及矩阵S1和S2的乘积。当矩阵序列只有一个矩阵时,显然连乘为0。
矩阵连乘动态规划实现:

/**
     * @param p 矩阵连乘中各个矩阵维度数组
     * @param n 连乘矩阵个数
     * @param s 最优矩阵连乘计算次数数组
     * @param m 最优矩阵连乘划分位置数组
     */
    public void multiplyChain(int[] p,int n,int[][] s,int[][] m){
        for(int i=1;i<=n;i++)s[i][i]=0;
        //确定矩阵连乘问题的规模  j个矩阵连乘
        for(int j=2;j<=n;j++){
            //遍历矩阵连乘的开始矩阵
            for(int r=1;r<=n-j+1;r++){
                //确定矩阵连乘的结束矩阵
                int l=r+j-1;
                s[r][l]=s[r+1][l]+p[r-1]*p[r]*p[l];
                for(int k=r+1;k<l;k++){
                    //从第k个矩阵开始划分
                    int value = +p[r-1]*p[k]*p[l];
                    if(value<s[r][l]) s[r][l]=value;
                }

        }
        }
    }

矩阵连乘的备忘录方法(自顶向下):

/**
     * 返回n个连乘矩阵最优计算次数
     * @param n 连乘矩阵个数
     * @param m 连乘矩阵最优计算次数数组
     * @param p 矩阵维度数组
     * @return
     */
    public int memorizedMatrixChain(int n,int[][] m,int[] p){
        //将矩阵最优次数全部设置为0 做备忘录
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                m[i][j]=0;
        return lookUpChain(1,n,m,p);
    }

    /**
     * 递归调用 返回矩阵a到矩阵b的最优计算次数
     * @param a 连乘开始范围
     * @param b 连乘结束范围
     * @param m 最优计算次数数组
     * @param p 矩阵维度数组
     * @return
     */
    public int lookUpChain(int a,int b,int[][] m,int[] p){
        //已经计算出了最优次数就不再进行计算
        if(m[a][b]>0)return m[a][b];
        if(a==b)return 0;
        //递归计算其它划分情况下的最优次数
        m[a][b]= lookUpChain(a+1,b,m,p)+p[a-1]*p[a]*p[b];
        for(int i=a+1;i<b;i++){
            int value = lookUpChain(a,i,m,p)+lookUpChain(i+1,b,m,p)+p[a-1]*p[i]*p[b];
            if(value<m[a][b]) m[a][b]=value;
        }
        return m[a][b];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Description 在讲动态规划课时,我们知道可用动态规划算法求解的问题应具备的一个基本要素是子问题的重叠质,矩阵连乘问题能用动态规划求解正是因为它具有重叠子问题。因此在解矩阵连乘问题的自顶向下的递归算法中,存在着大量的重叠子问题计算。例如要计算4个矩阵A1A2A3A4最小连乘次数,要分别计算A1(A2A3A4)、(A1A2)(A3A4)和(A1A2A3)A4三种情况下的最小连乘次数,而计算A1(A2A3A4)的最小连乘次数要计算其子问题A2A3A4的最小连乘次数,A2A3A4最小连乘次数的计算有二种情况(A2A3)A4和A2(A3A4),它分别包括求A2A3和A3A4两个子问题。同理,计算(A1A2)(A3A4)包含A1A2和A3A4两个子问题;计算(A1A2A3)A4包含计算A1A2A3、A1A2和A2A3这三个子问题。故在解A1A2A3A4的最小连乘次数时,其子问题的计算和重叠次数分别是: A1A2计算2次,重叠1次;A2A3计算2次,重叠1次;A3A4计算2次,重叠1次;A1A2A3只计算1次;A2A3A4只计算1次;A1A2A3A4只计算1次。因此,4个矩阵A1A2A3A4连乘的重叠子问题分别为:A1A2、A2A3和A3A4的计算各重叠一次。现在你的编程任务是:对于n个矩阵连乘,求其重叠子问题的计算次数。 Input 第一行是1个整数n(2≤n≤300),表示有n个矩阵连乘,接下来一行有n+1个数,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开. Output 输出重叠子问题计算次数和对应的子问题,中间以空格隔开,各子问题的重叠次数输出分别以A1、A2、… An打头的次序依次输出,格式如样例所示。如没有重叠子问题输出NO Sample Input 4 30 35 15 5 10 Sample Output 1 A1A2 1 A2A3 1 A3A4

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值