第2章 数字之魅——子数组之和的最大值(二维)

子数组之和的最大值(二维)

问题描述

  我们在前面分析了一维数组之和的最大值问题,那么如果是二维数组又该如何分析呢?

分析与解法

  最直接的方法,当然就是枚举每一个矩形区域,然后再求这个矩形区域中元素的和。

【解法一】

完整代码如下:

 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

【解法二】

posted @ 2015-07-08 19:40  ~风轻云淡~  阅读(263)  评论(0编辑  收藏  举报