最大子矩阵
题目描述
给定一个正整数和负整数组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可
说明
\(1 <= matrix.length, matrix[0].length <= 200\)
示例
输入:
[
[-1,0],
[0,-1]
]
输出: [0,1,0,1]
思路
图片来源B站UP zjutsunny
代码
class Solution {
public:
vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
int row=matrix.size();
int col=matrix[0].size();
vector<int> ans(4,0);
vector<vector<int>> prefixSUM(row+1,vector<int>(col,0));
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
prefixSUM[i+1][j]=prefixSUM[i][j]+matrix[i][j];
}
int tmp=INT32_MIN;
for(int up_cursor=0; up_cursor < row; up_cursor++)
{
for(int down_cursor=up_cursor; down_cursor < row; down_cursor++)
{
int dp=INT32_MIN;
int left_cursor=0;
for (int right_cursor=0; right_cursor < col; ++right_cursor)
{
if(dp>0)
{
dp+= prefixSUM[down_cursor + 1][right_cursor] - prefixSUM[up_cursor][right_cursor];
}
else
{
left_cursor=right_cursor;
dp= prefixSUM[down_cursor + 1][right_cursor] - prefixSUM[up_cursor][right_cursor];
}
if(dp>tmp)
{
tmp=dp;
ans={up_cursor, left_cursor, down_cursor, right_cursor};
}
}
}
}
return ans;
}
};

浙公网安备 33010602011771号