问题

给出一个长度为的序列表示个矩阵
其中分别表示第个矩阵的行和列
个矩阵按顺序相乘,最少需要做多少次乘法

解析

对于行列分别为的两个矩阵相乘,共需要次乘法
同时对于矩阵乘法,满足结合律但不满***换律,即
例如:对于序列表示矩阵

  • 按照原顺序,总运算次数为
  • 先对后两项做乘法,总运算次数为

显然不同的结合顺序会使总运算次数产生很大区别
做法:
我们考虑用动态规划的方法来解决这个问题
表示第各矩阵按一定顺序相乘的最小乘法次数

  • 证明满足最优化法则
    • 已知是当前子问题的最优答案
    • 假设不是最优的子问题答案,即存在
    • 那么
    • 也就是存在更优的,这与之前的假设相矛盾,得证

设计

 for (int i = 1; i <= n - 1; ++i)
        dp[i][i] = 0, s[i][i] = i;
    for (int len = 2; len <= n - 1; ++len)
    {
        for (int l = 1, r; l + len - 1 <= n - 1; ++l)
        {
            r = l + len - 1;
            int cur = a[l] * b[r];
            for (int k = l; k < r; ++k)
            {
                if (dp[l][k] + dp[k + 1][r] + cur * b[k] < dp[l][r])
                {
                    s[l][r] = k;
                    dp[l][r] = dp[l][k] + dp[k + 1][r] + cur * b[k];
                }
            }
        }
    }

分析

对于上述算法,共有3重循环,其中第一重次,第二重次,第三重
总复杂度为

源代码

传送门