import java.util.Random;
public class MaxSumMatrix {
public static void main(String[] args) {
int[][] p = { { 1, 12, -30 }, { 4, -6, 4 }, { -9, 1, 11 } };
int[] k = new int[] { -2, 5, -1, 9, 0 };
Random r = new Random();
for (int i = 0; i < 5; i++) {
k[i] = r.nextInt(30) - 15;
//System.out.print(k[i] + " ");
}
//maxSum(k);
displayMatrix(p);
int r2=maxSum2(p,3,3);
System.out.println(r2);
}
private static void displayMatrix(int[][] p) {
System.out.println("矩阵为:");
for (int i = 0; i < p.length; i++) {
for (int j = 0; j < p[i].length; j++) {
System.out.print(p[i][j] + "/t");
}
System.out.println();
}
}
/**
* 求一个矩阵中的一个子矩阵,使其各元素之和最大为所有子矩阵中最大
* @param p 二位矩阵
* @param m 矩阵行
* @param n 矩阵列
* @return
*/
public static int maxSum2(int[][] p, int m, int n) {
int i, j;
//子矩阵最大和
int sum = 0, tsum = 0;
int[] b = new int[n];
int[] s = new int[3];
//确定子矩阵的范围
//(i1,j1)为子矩阵左上角坐标,(i2,j2)为其右下角坐标
int i1 = 0, j1 = 0, i2 = 0, j2 = 0;
for (i = 0; i < m; i++) {
for (int k = 0; k < n; k++)
b[k] = 0;
for (j = i; j < m; j++) {
for (int k = 0; k < n; k++)
b[k] += p[j][k];
s = maxSum(b);
tsum = s[0];
if (tsum > sum) {
sum = tsum;
i1 = i;
i2 = j;
j1 = s[1];
j2 = s[2];
}
}
}
//输出这个子矩阵
System.out.println("子矩阵为:");
for (int ix = i1; ix <= i2; ix++) {
for (int jx = j1; jx <= j2; jx++)
System.out.print(p[ix][jx] + "/t");
System.out.println();
}
System.out.println("====================");
//返回子矩阵最大值
return sum;
}
//确定一元数组的最大和
private static int[] maxSum(int[] b) {
int len = b.length;
int[] s = new int[3];
int i, sum = 0xfffffff0, sum1 = 0;
//分别为最大和序列的开始和结束位置
int start = 0, end = 0;
for (i = 0; i < len; i++) {
if (sum1 > 0) {
sum1 += b[i];
} else {
sum1 = b[i];
if (sum1 > 0) {
start = i;
end = i;
}
}
if (sum1 > sum) {
sum = sum1;
if (sum < 0)
start = i;
end = i;
}
}
//System.out.println(start + "->" + end);
s[0] = sum;
s[1] = start;
s[2] = end;
//System.out.println(sum);
return s;
}
}