Program Explanation

The Matrix Chain Multiplication problem is to find the most efficient way to multiply a given sequence of matrices.
The objective is to minimize the number of scalar multiplications involved. Given the dimensions of the matrices,
we need to find the order in which to multiply them such that the number of operations is minimized.

We use a **dynamic programming** approach to solve this problem. We will compute the minimum number of operations for
every possible way to parenthesize the matrices and store these results in a table. Using this table, we can avoid
recomputing solutions to subproblems and efficiently find the optimal multiplication order.

Program Structure

  • We initialize a 2D DP table dp, where dp[i][j] will store the minimum number of scalar
    multiplications needed to multiply matrices from index i to j.
  • We iterate over increasing chain lengths of matrices and calculate the minimum cost for each sub-chain.
  • Finally, dp[1][n-1] will contain the minimum number of scalar multiplications needed to multiply
    all the matrices.

C++ Program Code


// C++ program to find the optimal way to multiply a chain of matrices

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

// Function to find the minimum number of multiplications needed to multiply the matrix chain
int matrixChainMultiplication(const vector<int>& dims) {
    int n = dims.size();  // Number of matrices + 1

    // DP table to store the minimum number of scalar multiplications
    vector<vector<int>> dp(n, vector<int>(n, 0));

    // dp[i][j] will hold the minimum number of multiplications required to multiply matrices A[i] to A[j]

    // L is the chain length (i.e., the number of matrices being multiplied together)
    for (int L = 2; L < n; L++) {
        for (int i = 1; i < n - L + 1; i++) {
            int j = i + L - 1;
            dp[i][j] = INT_MAX;  // Initialize to a very large number

            // Try different positions to split the product into two parts
            for (int k = i; k < j; k++) {
                // Compute the number of scalar multiplications for this partition
                int q = dp[i][k] + dp[k + 1][j] + dims[i - 1] * dims[k] * dims[j];

                // If this is the minimum cost so far, update dp[i][j]
                if (q < dp[i][j]) {
                    dp[i][j] = q;
                }
            }
        }
    }

    // Return the minimum number of multiplications to multiply matrices A[1] to A[n-1]
    return dp[1][n - 1];
}

int main() {
    // Example: dimensions of the matrices
    // For matrices A1 (10x20), A2 (20x30), A3 (30x40), A4 (40x30)
    // dims array = {10, 20, 30, 40, 30}
    vector<int> dims = {10, 20, 30, 40, 30};

    // Calculate and print the minimum number of multiplications
    int minMultiplications = matrixChainMultiplication(dims);
    cout << "The minimum number of multiplications is: " << minMultiplications << endl;

    return 0;
}
    

Code Documentation

Function: matrixChainMultiplication()
This function takes a vector of integers representing the dimensions of the matrices and returns the minimum number
of scalar multiplications needed to multiply the entire chain of matrices.

  • dims: A vector containing the dimensions of the matrices in the form {p0, p1, p2, …, pn},
    where matrix Ai has dimensions pi-1 x pi.
  • dp[i][j]: A DP table where dp[i][j] stores the minimum number of scalar multiplications needed to multiply matrices Ai to Aj.

Return Value:
The function returns the minimum number of scalar multiplications required to multiply the entire chain of matrices.

Function: main()
The main() function defines the dimensions of the matrices and calls the matrixChainMultiplication()
function to compute the minimum number of multiplications. The result is then printed to the console.

Key Concepts

Matrix Chain Multiplication: The problem is to determine the optimal order of multiplying matrices
that minimizes the number of scalar multiplications. Since matrix multiplication is associative, the challenge is
to find where to parenthesize the chain of matrices to minimize operations.

Dynamic Programming: We solve the problem using dynamic programming by breaking it down into smaller
subproblems (optimal multiplication of smaller chains) and using these solutions to solve the larger problem.

 

By Aditya Bhuyan

I work as a cloud specialist. In addition to being an architect and SRE specialist, I work as a cloud engineer and developer. I have assisted my clients in converting their antiquated programmes into contemporary microservices that operate on various cloud computing platforms such as AWS, GCP, Azure, or VMware Tanzu, as well as orchestration systems such as Docker Swarm or Kubernetes. For over twenty years, I have been employed in the IT sector as a Java developer, J2EE architect, scrum master, and instructor. I write about Cloud Native and Cloud often. Bangalore, India is where my family and I call home. I maintain my physical and mental fitness by doing a lot of yoga and meditation.

Leave a Reply

Your email address will not be published. Required fields are marked *

error

Enjoy this blog? Please spread the word :)