1. Recursive Exhaustive Partitioning
Intuition
At each interval (i, j), test every possible split point k from i to j-1 recursively.
Algorithm
- Define
solve(i, j). - If
i == j, return 0. - Initialize
minCost = infinity. - For
k = itoj - 1: -
cost = solve(i, k) + solve(k + 1, j) + p[i - 1] * p[k] * p[j] -
minCost = min(minCost, cost). - Return
minCost.
#include <iostream>#include <vector>#include <algorithm> using namespace std; int solveRec(int i, int j, const vector<int>& p) { if (i == j) return 0; int minCost = 1e9; for (int k = i; k < j; k++) { int cost = solveRec(i, k, p) + solveRec(k + 1, j, p) + p[i - 1] * p[k] * p[j]; minCost = min(minCost, cost); } return minCost;} int matrixMultiplicationRec(vector<int>& p) { int n = p.size(); return solveRec(1, n - 1, p);} int main() { vector<int> p = {40, 20, 30, 10, 30}; cout << "Min Multiplications (Recursive): " << matrixMultiplicationRec(p) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(4^n / n^(3/2)) (Catalan growth) - Space complexity:
O(n) call stack