码迷,mamicode.com
首页 > 其他好文 > 详细

[动态规划] 矩阵链乘法问题

时间:2018-01-30 19:50:45      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:构造   algorithm   局部最优   ima   乘法   master   http   struct   color   

什么是矩阵链乘法(Matrix Chain Multiplication)

矩阵链乘法问题是指给定一串矩阵序列M?M2..Mn,求至少需要进行多少次乘法运算才能求得结果

比如对于这个M?M?M?的矩阵链, 

技术分享图片
我们可以先计算M?M?然后结果乘以M?,也可以M?M?先算,然后乘以M?,为了表达方便,可以用括号表示计算顺序。 矩阵链M?M?M?有两种计算顺序:((M?M?)M?)和(M?(M?M?))。 那么不同计算顺序有什么区别? 对于((M?M?)M?): 技术分享图片对于(M?(M?M?)): 技术分享图片

我们要做的就是找到让乘法运算最少的计算顺序,换言之就是找一种加括号方式,使得最后乘法运算最少

状态转移方程

现用 optimal(M?M?) 表示M?M?最优计算成本 cost(M?M?) 表示M?M?计算成本optimal(M?M?)=optimal(M?)+optimal(M?)+cost(M?M?)

optimal(M?)和optimal(M?)均为零;同理

optimal(M?M?)=optimal(M?)+optimal(M?)+cost(M?M?)

(M?M?M?)有两种加括号方式, 它的最优计算成本是这两种加括号方式中最优的那个,即:optimal(M?M?M?)=min{optimal((M?M?)M?),optimal(M?(M?M?))}

显然,这里说的正是动态规划思想:我们从局部最优解出发,逐渐构造出大问题(同时局部最优解还有重叠,可以保存计算结果免去后面计算)。状态方程已经构造出来了,下面就是实际的实现

 

实现

#include <iostream>
#include <algorithm>
#include <climits>

int dp[1024][1024] = { 0 };

struct Matrix {
    int row;
    int column;
};

int matrixChainCost(Matrix *ms, int n) {
    for (int scale = 2; scale <= n; scale++) {
        for (int i = 0; i <= n - scale; i++) {
            int j = i + scale - 1;
            dp[i][j] = INT_MAX;
            for (int k = i; k < j; k++) {
                dp[i][j] = std::min(dp[i][j], dp[i][k] + dp[k+1][j] + (ms[i].row*ms[k].column*ms[j].column));
            }
        }
    }
    return dp[0][n - 1];
}

int main() {
    int n;
    std::cin >> n;  //n个矩阵组成的矩阵链
    Matrix *ms = new Matrix[n];
    for (int i = 0; i<n; i++) {
        std::cin >> ms[i].row;      //第i个矩阵的行数
        std::cin >> ms[i].column;   //第i个矩阵的列数
    }
    std::cout << matrixChainCost(ms, n);
    system("pause");
    return 0;
}

 

 

[动态规划] 矩阵链乘法问题

标签:构造   algorithm   局部最优   ima   乘法   master   http   struct   color   

原文地址:https://www.cnblogs.com/racaljk/p/8385861.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!