思路:先对所有的连续行进行组合,如包含第一行的子矩阵,如1, 12, 123, 1---m;包含第二行的子矩阵2, 23, 234, 2--m;同理其它
再将这些子矩阵对应的列上的元素相加,此时就可以使用一维上最大子数组求和的动态规划算法了。整体的时间复杂度为O(n^3)空间复杂度为O(n)
int findMaxSumOfMatrix(vector<vector<int> > &vvi){
int m = vvi.size();
if(0 == m) return 0;
int n = vvi[0].size();
int maxValue = vvi[0][0];
for(int i = 0; i < m; i++){ //从第0行开始
vector<int> vi(n, 0);
for(int j = i; j < m; j++){ //包含第i行的矩阵 0, 01, 012, 0123, 01...m - 1
for(int k = 0; k < n; k++){ //包含第k列的矩阵 0, 01, 012, 0123, 01...n - 1
vi[k] += vvi[j][k]; //vi[k]表示包含i行的矩阵的 各列之和即 v[0]即从vvi[0][0]-v[k][0]之和
}
/*一维数组中求最大连续子数组之和 动态规划的运用 */
int curSum = vi[0];
int allSum = vi[0];
for(int k = 1; k < n; k++){ //从vi[k]中选出最大的子矩阵和
curSum = max(vi[k], curSum + vi[k]);
allSum = max(allSum, curSum);
maxValue = max(allSum, maxValue);
}
}
}
return maxValue;
}