LeetCode1594. 矩阵的最大非负积
给你一个大小为 rows x cols 的矩阵 grid 。最初,你位于左上角 (0, 0) ,每一步,你可以在矩阵中 向右 或 向下 移动。
在从左上角 (0, 0) 开始到右下角 (rows - 1, cols - 1) 结束的所有路径中,找出具有 最大非负积 的路径。路径的积是沿路径访问的单元格中所有整数的乘积。
返回 最大非负积 对 109?+ 7 取余 的结果。如果最大积为负数,则返回 -1 。
注意,取余是在得到最大积之后执行的。
示例 1:
输入:grid = [[-1,-2,-3],
[-2,-3,-3],
[-3,-3,-2]]
输出:-1
解释:从 (0, 0) 到 (2, 2) 的路径中无法得到非负积,所以返回 -1
示例 2:
输入:grid = [[1,-2,1],
[1,-2,1],
[3,-4,1]]
输出:8
解释:最大非负积对应的路径已经用粗体标出 (1 * 1 * -2 * -4 * 1 = 8)
class Solution {
public:
int maxProductPath(vector<vector<int>>& grid) {
const int mod = 1000000000 + 7;
int m = grid.size(), n = grid[0].size();
vector<vector<long long>> maxgt(m, vector<long long>(n));
vector<vector<long long>> minlt(m, vector<long long>(n));
maxgt[0][0] = minlt[0][0] = grid[0][0];
for (int i = 1; i < n; i++) {
maxgt[0][i] = minlt[0][i] = maxgt[0][i - 1] * grid[0][i];
}
for (int i = 1; i < m; i++) {
maxgt[i][0] = minlt[i][0] = maxgt[i - 1][0] * grid[i][0];
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (grid[i][j] >= 0) {
maxgt[i][j] = max(maxgt[i][j - 1], maxgt[i - 1][j]) * grid[i][j];
minlt[i][j] = min(minlt[i][j - 1], minlt[i - 1][j]) * grid[i][j];
} else {
maxgt[i][j] = min(minlt[i][j - 1], minlt[i - 1][j]) * grid[i][j];
minlt[i][j] = max(maxgt[i][j - 1], maxgt[i - 1][j]) * grid[i][j];
}
}
}
if (maxgt[m - 1][n - 1] < 0) {
return -1;
} else {
return maxgt[m - 1][n - 1] % mod;
}
}
};