1. 暴力做法枚举r1,c1, r2, c2,求和,时间复杂度O(N^6)很爆炸。
2. 优化方法,二维前缀和优化,O(1)时间内求出给定r1,c1,r2,c2区域的和,时间复杂度为O(N^4)
3. 降维动态规划优化。
枚举起始行和结束行,对列求和,等效成一维最大子序列问题。由于所有起始行和结束行都枚举过,所以这个做法一定是对的。
这道题目还需要记录更新r1,c1,r2,c2比一般的题目要难。
class Solution {
public:
vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
int max = INT_MIN, n = matrix.size(), m = matrix[0].size();
int r1, c1, r2, c2;
for(int i=0;i<n;i++){
vector<int> s(m);
for(int j=i;j<n;j++){
int cur = 0, tmp = 0;
for(int k=0;k<m;k++){
s[k]+=matrix[j][k];
if(cur>0) cur+=s[k];