Java:
package blueBridge;
import java.util.*;
import java.math.BigInteger;
import java.util.*;
public class testOne {
/*
* 题目
* 给定一个矩阵matrix,返回子矩阵的最大累加和
* */
static int addNum(int[] arr) {
int sumJ=arr[0];
int max=sumJ;
int left=0,right=0; //标志每一个正数子序列的端点
for(int j=1;j<arr.length;j++) {
if(sumJ>=0) { //表示这个子序列暂时还为正数,还有意义,继续累加
sumJ+=arr[j];
}else { //子序列为负,无意义,所以抛弃重新赋值第一个数,设置序列起始点
sumJ=arr[j];
left=j;
}
if(sumJ>max) {
max=sumJ;
right=j;
}
}
return max;
}
static int maxSum(int[][] matrix) {
int beginRow=0; //以它为起始行
int m=matrix.length;
int n=matrix[0].length;
int[] sums=new int[n]; //按列求和
int max=0; //最大子矩阵和
while(beginRow<m) { //起始行
for(int i=beginRow;i<m;i++) { //以起始行为矩阵顶部做矩阵,将矩阵按列求和,形成以为数组,然后用数组子序列求和思想
for(int j=0;j<n;j++) {
sums[j]+=matrix[i][j];
}
int t=addNum(sums);
if(t>max) {
max=t;
}
}
Arrays.fill(sums, 0);
beginRow++;
}
return max;
}
public static void main(String[] args) {
int[][] matrix= {{1,-2,3,5,-2,6},{5,-7,4,6,-4,-8},{4,3,-3,-4,5,2},{1,4,-2,-3,-1,-5},{-3,3,2,-4,1,-2}};
int res=maxSum(matrix);
System.out.println(res);
}
}