问题描述:求二维数组(矩阵)的子矩阵之和的最大值。
import java.util.Scanner;
public class BeautyPro215 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int m = scanner.nextInt();
int n = scanner.nextInt();
int[][] a = new int[m+1][n+1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
a[i][j] = scanner.nextInt();
}
}
System.out.println(maxSubTwoArray(m, n, a));
}
}
// 暴力枚舉法
/*public static int maxSubTwoArray(int m, int n, int[][] a) {
int maxSum = Integer.MIN_VALUE;
for (int minX = 0; minX < m; minX++) {
for (int maxX = minX; maxX < m; maxX++) {
for (int minY = 0; minY < n; minY++) {
for (int maxY = minY; maxY < n; maxY++) {
int tempSum = sumOfRegion(a, minX, minY, maxX, maxY);
if (tempSum > maxSum) {
maxSum = tempSum;
}
}
}
}
}
return maxSum;
}*/
public static int maxSubTwoArray(int m, int n, int[][] a) {
int maxSum = Integer.MIN_VALUE;
int[][] partSum = sumOfSec(m, n, a);
for (int minX = 1; minX <= m; minX++) {
for (int maxX = minX; maxX <= m; maxX++) {
for (int minY = 1; minY <= n; minY++) {
for (int maxY = minY; maxY <= n; maxY++) {
int tempSum = sumOfRegion(partSum, minX, minY, maxX, maxY);
if (tempSum > maxSum) {
maxSum = tempSum;
}
}
}
}
}
return maxSum;
}
//部分和
public static int[][] sumOfSec(int m, int n, int[][] a) {
int[][] partSum = new int[m+1][n+1];
for(int i=0;i<=m;i++){
partSum[i][0] = 0;
}
for(int i=0;i<=n;i++){
partSum[0][i] = 0;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
partSum[i][j] = partSum[i-1][j] + partSum[i][j-1] - partSum[i-1][j-1] + a[i][j];
}
}
return partSum;
}
//区域和
public static int sumOfRegion(int[][] partSum, int minX, int minY, int maxX,
int maxY) {
return partSum[maxX][maxY] - partSum[minX-1][maxY]- partSum[maxX][minY-1] + partSum[minX-1][maxY-1];
}
}