1. Recursive Multi-Source DFS
Intuition
From every row in column 0, recursively branch into up-right, right, and down-right cells until column m-1 is reached.
Algorithm
- Define
dfs(r, c). - If
r < 0orr >= n, return 0. - If
c == m - 1, returnmat[r][c]. - Option 1: up-right
dfs(r - 1, c + 1). - Option 2: right
dfs(r, c + 1). - Option 3: down-right
dfs(r + 1, c + 1). - Return
mat[r][c] + max({Option 1, Option 2, Option 3}). - Call
dfs(r, 0)for all0 <= r < nand return max.
#include <iostream>#include <vector>#include <algorithm> using namespace std; int dfs(int r, int c, int n, int m, const vector<vector<int>>& mat) { if (r < 0 || r >= n) return 0; if (c == m - 1) return mat[r][c]; int upRight = dfs(r - 1, c + 1, n, m, mat); int right = dfs(r, c + 1, n, m, mat); int downRight = dfs(r + 1, c + 1, n, m, mat); return mat[r][c] + max({upRight, right, downRight});} int maxGoldRec(const vector<vector<int>>& mat) { int n = mat.size(), m = mat[0].size(); int maxGold = 0; for (int r = 0; r < n; r++) { maxGold = max(maxGold, dfs(r, 0, n, m, mat)); } return maxGold;} int main() { vector<vector<int>> mat = { {1, 3, 3}, {2, 1, 4}, {0, 6, 4} }; cout << "Max Gold (Recursive): " << maxGoldRec(mat) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(n * 3^m) - Space complexity:
O(m) recursion stack