Advertisement
1594. Maximum Non Negative Product in a Matrix
UnknownView on LeetCode
1594.cs
C#
public class Solution
{
public int MaxProductPath(int[][] grid)
{
const int MOD = 1_000_000_007;
int m = grid.Length;
int n = grid[0].Length;
// dpMin[i][j] := the minimum product from (0, 0) to (i, j)
// dpMax[i][j] := the maximum product from (0, 0) to (i, j)
long[,] dpMin = new long[m, n];
long[,] dpMax = new long[m, n];
dpMin[0, 0] = dpMax[0, 0] = grid[0][0];
for (int i = 1; i < m; ++i)
dpMin[i, 0] = dpMax[i, 0] = dpMin[i - 1, 0] * grid[i][0];
for (int j = 1; j < n; ++j)
dpMin[0, j] = dpMax[0, j] = dpMin[0, j - 1] * grid[0][j];
for (int i = 1; i < m; ++i)
{
for (int j = 1; j < n; ++j)
{
if (grid[i][j] < 0)
{
dpMin[i, j] = Math.Max(dpMax[i - 1, j], dpMax[i, j - 1]) * grid[i][j];
dpMax[i, j] = Math.Min(dpMin[i - 1, j], dpMin[i, j - 1]) * grid[i][j];
}
else
{
dpMin[i, j] = Math.Min(dpMin[i - 1, j], dpMin[i, j - 1]) * grid[i][j];
dpMax[i, j] = Math.Max(dpMax[i - 1, j], dpMax[i, j - 1]) * grid[i][j];
}
}
}
long mx = Math.Max(dpMin[m - 1, n - 1], dpMax[m - 1, n - 1]);
return mx < 0 ? -1 : (int)(mx % MOD);
}
}Advertisement
Was this solution helpful?