编程之美2.15子数组之和的最大值(二维)

来源:互联网 发布:java字符串换行连接 编辑:程序博客网 时间:2024/05/22 02:24

问题描述:求二维数组(矩阵)的子矩阵之和的最大值。

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];    }}
0 0