题目链接:http://poj.org/problem?id=1050
写的有点复杂了,据说大牛们有超高效的算法,麻烦知道的朋友贴一下啊!!!!
/*
* 求最大子矩阵和值问题
* 思路:要转换为一位数组最大和值问题
* 1、首先假设最大子矩阵为从第i行到第j行,第k列到第xxx)
* 2、分别求子矩阵的和值保存在数组中
* 3、比较得最大子矩阵和值
* */
import java.util.Scanner;
public class PKU1050 {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n;
int[][] arr;
while (sc.hasNext()) {
n = sc.nextInt();
arr = new int[n][n];
// 接收输入,初始化二维数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = sc.nextInt();
}
}
System.out.println(maxSubMatrixSum(arr, n));
}
}
// 假设从第i行到第 j行的第k列到第xxx列的值的和是最大矩阵和
private static int maxSubMatrixSum(int[][] arr, int n) {
int[] a;
int[] result;
int i, j, k, m, max = Integer.MIN_VALUE;
for (i = 0; i < n; i++) {// 开始行
for (j = i; j < n; j++) {//结束行
a = new int[100];
result = new int[101];
for (k = 0; k < n; k++) {// 第k列
for (m = i; m <= j; m++) {// 从第i行到第m行的第k列的和值
a[k] += arr[m][k];
}
//得到从第i行到第m行的第k列的和值的最大值保存在result中
if (result[k] >= 0)
result[k + 1] = result[k] + a[k];
else
result[k + 1] = a[k];
}
//得到从第i行到第m行的和值的最大值保存在max中
for (int x = 0; x < k; x++) {
if (max < result[x])
max = result[x];
}
}
}
return max;
}
}