题目:给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:
9 2
-4 1
-1 8
其元素总和为15。
思路:首先如果是一维数组求最大和,sum为记录区间之间的和,那么从第0个元素开始加起。如果sum<0的话,就将sum置0,并重新开始从这一点开始加起。如果sum>0的话,就继续向右加。那么可不可以推广到二维数组呢。也可以这么想如何将二维数组转换成一维数组。将m行到k行的数组元素按列相加,就得到了一个一维数组,再按此求二维数组的最大和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int t=in.nextInt();
while (t-->0) {
int m=in.nextInt();
int n=in.nextInt();
int arr[][]=new int[m+1][n];
for (int i = 1; i <=m; i++) {
for (int j = 0; j < n; j++) {
arr[i][j]=in.nextInt();
arr[i][j]=arr[i][j]+arr[i-1][j];
}
}
int count=0;
for (int i = 1,c=arr[1][0]; i <=m; i++) {
for (int j = i; j <=m; j++) {
for (int k = 0,max=0; k < n; k++) {
int temp=arr[j][k]-arr[i-1][k];
max=(max>=0?max:0)+temp;
c=max>c?max:c;
count=c;
}
}
}
System.out.println(count);
}
// TODO Auto-generated method stub
}
}