子数组之和的最大值(二维)
问题描述
我们在前面分析了一维数组之和的最大值问题,那么如果是二维数组又该如何分析呢?
分析与解法
最直接的方法,当然就是枚举每一个矩形区域,然后再求这个矩形区域中元素的和。
【解法一】
完整代码如下:
1 package chapter2shuzizhimei.maxsumsubarraytwodimensional; 2 /** 3 * 求数组的子数组之和的最大值(二维) 4 * 【解法一】 5 * @author DELL 6 * 7 */ 8 public class MaxSumSubArray2d { 9 //找两个数的最大值 10 public static double max(double a, double b) { 11 return a > b ? a : b; 12 } 13 /** 14 * 求数组的子数组之和的最大值(二维) 15 * @param a 二维数组 16 * @param n 行 17 * @param m 列 18 * @return 最大和 19 */ 20 public static double maxSum(double a[][],int n, int m){ 21 double maximum = a[0][0]; //最大和 22 int i_min,i_max,j_min,j_max,i,j; 23 double sum; 24 double ps[][] = new double[n][m]; //部分和 25 ps[0][0]=a[0][0]; 26 for(i=1;i<n;i++) 27 ps[i][0]=ps[i-1][0]+a[i][0]; 28 for(j=1;j<m;j++) 29 ps[0][j]=ps[0][j-1]+a[0][j]; 30 for(i=1;i<n;i++) 31 for(j=1;j<m;j++) 32 ps[i][j]=ps[i-1][j]+ps[i][j-1]-ps[i-1][j-1]+a[i][j]; 33 for(i_min=0;i_min<n;i_min++) 34 for(i_max=i_min;i_max<n;i_max++) 35 for(j_min=0;j_min<m;j_min++) 36 for(j_max=j_min;j_max<m;j_max++){ 37 if(i_min==0&&j_min!=0) 38 sum = ps[i_max][j_max]-ps[i_max][j_min-1]; 39 else if(j_min==0&&i_min!=0) 40 sum = ps[i_max][j_max]-ps[i_min-1][j_max]; 41 else if(i_min==0&&j_min==0) 42 sum = ps[i_max][j_max]; 43 else{ 44 sum = ps[i_max][j_max]-ps[i_min-1][j_max]-ps[i_max][j_min-1]+ps[i_min-1][j_min-1]; 45 } 46 maximum = max(maximum,sum); 47 } 48 return maximum; 49 } 50 51 public static void main(String[] args) { 52 double a[][] = {{4,1},{-1,-1}}; 53 System.out.println("求数组的子数组之和的最大值(二维)为:"+maxSum(a,2,2)); 54 55 } 56 57 }
程序运行结果如下:
求数组的子数组之和的最大值(二维)为:5.0