码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-08 20:50:41      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

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

问题描述

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

分析与解法

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

【解法一】

技术分享

技术分享

技术分享

完整代码如下:

 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

【解法二】

技术分享

技术分享

技术分享

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

标签:

原文地址:http://www.cnblogs.com/gaopeng527/p/4630579.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!