Complete-Preparation

🎉 One-stop destination for all your technical interview Preparation 🎉

View the Project on GitHub

Maximum Path Sum in Matrix 🌟🌟

Recursive Approach

int f(vector<vector<int>>& matrix, int n, int m, int i, int j)
{
    if (i < 0 || j < 0 || i >= n || j >= m)
        return INT_MIN;
    if (i == 0)
        return matrix[i][j];

    int lDig = f(matrix, n, m, i - 1, j - 1);
    int rDig = f(matrix, n, m, i - 1, j + 1);
    int up = f(matrix, n, m, i - 1, j);

    return matrix[i][j] + max({ lDig, up, rDig });
}

int getMaxPathSum(vector<vector<int>>& matrix)
{
    int res = INT_MIN;
    int n = matrix.size(), m = matrix[0].size();

    // check for every column in the last row
    for (int j = 0; j < m; j++) {
        int currSum = f(matrix, n, m, n - 1, j);
        res = max(res, currSum);
    }
    return res;
}

Memoization(top-down)

int f(vector<vector<int>>& matrix, int n, int m, int i, int j, vector<vector<int>>& dp)
{
    if (i < 0 || j < 0 || i >= n || j >= m)
        return INT_MIN;
    if (i == 0)
        return matrix[i][j];

    if (dp[i][j] != -1)
        return dp[i][j];

    int lDig = f(matrix, n, m, i - 1, j - 1, dp);
    int rDig = f(matrix, n, m, i - 1, j + 1, dp);
    int up = f(matrix, n, m, i - 1, j, dp);

    return dp[i][j] = matrix[i][j] + max({ lDig, up, rDig });
}

int getMaxPathSum(vector<vector<int>>& matrix)
{
    int res = INT_MIN;
    int n = matrix.size(), m = matrix[0].size();
    vector<vector<int>> dp(n, vector<int>(m, -1));
    for (int j = 0; j < m; j++) {
        int currSum = f(matrix, n, m, n - 1, j, dp);
        res = max(res, currSum);
    }
    return res;
}

Tabulation(Bottom-up)

int getMaxPathSum(vector<vector<int>>& matrix)
{
    int res = INT_MIN;
    int n = matrix.size(), m = matrix[0].size();
    vector<vector<int>> dp(n, vector<int>(m, 0));

    for (int j = 0; j < m; j++) {
        dp[0][j] = matrix[0][j];
    }

    for (int i = 1; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int up = dp[i - 1][j];
            int lDig = (j - 1 >= 0) ? dp[i - 1][j - 1] : INT_MIN; // check for valid j
            int rDig = (j + 1 < m) ? dp[i - 1][j + 1] : INT_MIN; // check for valid j

            dp[i][j] = matrix[i][j] + max({ lDig, up, rDig });
        }
    }

    // get maximum from last row
    for (int j = 0; j < m; j++) {
        res = max(res, dp[n - 1][j]);
    }
    return res;
}

Space Optimized Tabulation

int getMaxPathSum(vector<vector<int>>& matrix)
{
    int res = INT_MIN;
    int n = matrix.size(), m = matrix[0].size();
    vector<int> prev(m, 0), curr(m, 0);

    for (int j = 0; j < m; j++) {
        prev[j] = matrix[0][j];
    }

    for (int i = 1; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int up = prev[j];
            int lDig = (j - 1 >= 0) ? prev[j - 1] : INT_MIN; // check for valid j
            int rDig = (j + 1 < m) ? prev[j + 1] : INT_MIN; // check for valid j

            curr[j] = matrix[i][j] + max({ lDig, up, rDig });
        }
        prev = curr;
    }

    // get maximum from last row
    for (int j = 0; j < m; j++) {
        res = max(res, prev[j]);
    }
    return res;
}