🎉 One-stop destination for all your technical interview Preparation 🎉
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;
}
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;
}
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;
}
dp[i - 1] = prev
dp[i] = curr
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;
}