Skip to content

Commit 5853480

Browse files
authored
Create maximum-non-negative-product-in-a-matrix.cpp
1 parent 582b68a commit 5853480

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Time: O(m * n)
2+
// Space: O(n)
3+
4+
// dp with rolling window
5+
class Solution {
6+
public:
7+
int maxProductPath(vector<vector<int>>& grid) {
8+
static const int MOD = 1e9 + 7;
9+
vector<vector<int64_t>> max_dp(2, vector<int64_t>(size(grid[0])));
10+
vector<vector<int64_t>> min_dp(2, vector<int64_t>(size(grid[0])));
11+
for (int i = 0; i < size(grid); ++i) {
12+
for (int j = 0; j < size(grid[0]); ++j) {
13+
if (i == 0 && j == 0) {
14+
max_dp[0][0] = min_dp[0][0] = grid[0][0];
15+
continue;
16+
}
17+
auto curr_max = max(i > 0 ? max_dp[(i - 1) % 2][j] : max_dp[i % 2][j - 1],
18+
j > 0 ? max_dp[i % 2][j - 1] : max_dp[(i - 1) % 2][j]);
19+
auto curr_min = min(i > 0 ? min_dp[(i - 1) % 2][j] : min_dp[i % 2][j - 1],
20+
j > 0 ? min_dp[i % 2][j - 1] : min_dp[(i - 1) % 2][j]);
21+
if (grid[i][j] < 0) {
22+
swap(curr_max, curr_min);
23+
}
24+
max_dp[i % 2][j] = curr_max * grid[i][j];
25+
min_dp[i % 2][j] = curr_min * grid[i][j];
26+
}
27+
}
28+
return max_dp[(size(grid) - 1) % 2].back() >= 0 ? max_dp[(size(grid) - 1) % 2].back() % MOD : -1;
29+
}
30+
};

0 commit comments

Comments
 (0)