|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述:
- 给你一个大小为 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)
- 示例 3:
- 输入:grid = [[1, 3],
-   [0,-4]]
- 输出:0
- 解释:最大非负积对应的路径已经用粗体标出 (1 * 0 * -4 = 0)
- 示例 4:
- 输入:grid = [[ 1, 4,4,0],
-   [-2, 0,0,1],
-   [ 1,-1,1,1]]
- 输出:2
- 解释:最大非负积对应的路径已经用粗体标出 (1 * -2 * 1 * -1 * 1 * 1 = 2)
-  
- 提示:
- 1 <= rows, cols <= 15
- -4 <= grid[i][j] <= 4
- 来源:力扣(LeetCode)
- 链接:https://leetcode-cn.com/problems/maximum-non-negative-product-in-a-matrix
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码
- class Solution {
- public:
- int maxProductPath(vector<vector<int>>& grid) {
- //动态规划
- //定义
- int len1 = grid.size(), len2 = grid[0].size();
- vector<vector<long long> >dp1(len1, vector<long long>(len2, 0));
- vector<vector<long long> > dp2(len1, vector<long long>(len2, 0));
- //初始化(初始化是有递归公式决定的)
- dp1[0][0] = grid[0][0];
- dp2[0][0] = grid[0][0];
- for(int i = 1; i < len1; i++){
- dp1[i][0] = dp1[i-1][0] * grid[i][0];
- dp2[i][0] = dp2[i-1][0] * grid[i][0];
- }
- for(int i = 1; i < len2; i++){
- dp1[0][i] = dp1[0][i-1] * grid[0][i];
- dp2[0][i] = dp2[0][i-1] * grid[0][i];
- }
- //递归公式
- for(int i = 1; i < len1; i++){
- for(int j = 1; j < len2; j++){
- dp1[i][j]=max({dp1[i-1][j]*grid[i][j], dp1[i][j-1]*grid[i][j],dp2[i-1][j]*grid[i][j], dp2[i][j-1]*grid[i][j]});
- dp2[i][j]=min({dp1[i-1][j]*grid[i][j], dp1[i][j-1]*grid[i][j],dp2[i-1][j]*grid[i][j], dp2[i][j-1]*grid[i][j]});
- }
- }
- int mode = 1e9+7;
- return dp1[len1-1][len2-1] >= 0 ? (int)(dp1[len1-1][len2-1] % mode) : -1;
- }
- };
复制代码
参考链接:https://leetcode-cn.com/problems ... hi-hua-by-niu-tou-/ |
|