Matrix Chain Multiplication

Problem Statement:

find the minimum number of multiplications needed to multiply \(A_1, A_2, A_3, ...A_n\) where \(A_i\) is a matrix .

since number of columns in \(A_{i-1}\) is same as number of rows in \(A_{i}\) the input to this problem is an array \(order[\ ]\) of n+1 numbers where first number is number of rows in \(A_1\) and \(i^{th}\) (i > 1) number is number of colums in \(A_{i}\). Finally order of matrix \(A_{i}\) is \(order[i-1] \times order[i]\) .

Algorithm

1. slipt the matrix multiplication \(A_i.A_{i+1}....A_j\) for every k from i to j.

2. We call mcm( ) for matrices \(A_i\) to \(A_k\) and for \(A_{k+1}\) to \(A_j\) and add these two with \(order[i - 1] * order[k] * order[j]\) which is number of multiplication needed for multiplying these two parts.

3. return minimum value of \(mcm(A_i ...A_k) + mcm(A_{k+1} .. A_j) + order[i - 1] * order[k] * order[j]\) for all k in i to j

4. The same thing can be illustrated by the following figure.

mcs

Code :

    // matrix chain multiplication

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int mcm(int order[], int i, int j)
    {
    
        if (i == j)
        {
            return 0;
        }
        int min = INT_MAX;
        for (int k = i; k < j; k++)
        {
            int count = mcm(order, i, k) + mcm(order, k + 1, j) + order[i - 1] * order[k] * order[j];
            if (count < min)
            {
                min = count;
            }
        }
        return min;
    }
    
    int main()
    {
        int n;
        cin >> n;
        int order[n];
        for (int i = 0; i < n; i++)
        {
            cin >> order[i];
        }
        cout<<" min multiplications = "<<mcm(order,1,n-1)<<"\n";
    }         
                
    

Complexity Analysis :

Time complexity : \(O(n^3)\)

video resources

web resources

book resources