思路:
遍历以每一行开始,其他行结束的子矩阵最大和。而该子矩阵的最大和就是子矩阵每行元素相加得到的数组的最大子数组之和。
时间复杂度O(m*m*n);m为行数,n为列数;如果行数比列数大的话,就把数组按列的方法进行操作,时间复杂度就是O(m*n*n);
public class Problem_01_SubMatrixMaxSum {
public static int maxSum(int[][] m) {
if (m == null || m.length == 0 || m[0].length == 0) {
return 0;
}
int max = Integer.MIN_VALUE;
int cur = 0;
int[] s = null; // 累加数组
for (int i = 0; i != m.length; i++) { //以第i行开始
s = new int[m[0].length];
for (int j = i; j != m.length; j++) { //包含i~j行的子矩阵
cur = 0;
for (int k = 0; k != s.length; k++) { //用于遍历所有的列
s[k] += m[j][k]; //子矩阵得到的累加数组
cur += s[k]; //累加数组的当前累加和
max = Math.max(max, cur); //记录累加数组的最大子数组累加和
cur = cur < 0 ? 0 : cur;
}
}
}
return max;
}
public static void main(String[] args) {
int[][] matrix = { { -90, 48, 78 }, { 64, -40, 64 }, { -81, -7, 66 } };
System.out.println(maxSum(matrix));
}
}