第四章——求最大子矩阵累加和

来源:互联网 发布:海洛因在淘宝的名称 编辑:程序博客网 时间:2024/05/17 07:46


思路:

遍历以每一行开始,其他行结束的子矩阵最大和。而该子矩阵的最大和就是子矩阵每行元素相加得到的数组的最大子数组之和。

时间复杂度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));}}