最大子矩阵的和(N*N的矩阵)
题目描述:
给定一个n行n列的矩阵,其中 n 的取值范围为 0到100之间的整数,请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。
Example:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其中左下角的子矩阵:
9 2
-4 1
此子矩阵的值为9+2+(-4)+1+(-1)+8=15。
注意
此类型的题目有多个变种,问题的描述比较详细。所以要仔细区分。
解题思路
给定了一个矩阵,或者叫二维数组。大小是N行N列。
我们考虑一种特殊情况,N=1时:即只有1行1列的情况;那最大子矩阵就是其元素自己与自己求和的结果。
当N=4时,矩阵为4行4列,
那么根据示例中给出的数据,子矩阵的划分方法可以有许多种,假设我们取值的窗口为前2行,即:
0 -2 -7 0
9 2 -6 2
我们将第一行(i=1时)的第j列数据和第二行(i=2时)的第j列数据对应相加;这样就得到一个一维数组,即
[9,0,-13,2]
那么问题就转换为,就一个一维数组的最大子段和的问题了。
同样,我们取值窗口为前3行,或者前4行;然后将每一行对应得列上下相加;
最终都可以将问题转换为求一个一维数组的最大字段和的问题。
package com.bean.algorithmexec;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class MaxSubArrayDemo {
/*
* 最大子矩阵的问题
* 给定一个n*n(00) {
b += a[i];
}
else {
b = a[i]; //如果前面为零,如果相加,则影响后面结果,所以抛弃前面总和
}
if (b > sum) {
sum = b;
}
}
return sum;
}
/*
* 根据题目的假设条件,矩阵为 n*n的矩阵,并且(0sum) {
sum = max;
}
}
}
return sum;
}
public static void main(String args[]) throws FileNotFoundException {
MaxSubArrayDemo p = new MaxSubArrayDemo();
System.setIn(new FileInputStream("G:\\MaxSubArrayDemo.txt"));
sc = new Scanner(System.in);
while (sc.hasNextLine()) {
int n = 0;
int[][] array = new int[101][101];
while (sc.hasNext()) {
n = sc.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
array[i][j] = sc.nextInt();
System.out.print(array[i][j] + "\t");
}
System.out.println();
}
System.out.println(p.maxSubMatrix(n, array));
}
}
}
}
(完)