zoukankan      html  css  js  c++  java
  • 第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

    【解法二】

  • 相关阅读:
    iOS 获取当前设备类
    iOS 字体详解
    iOS屏幕旋转总结
    CocoaPods安装和使用教程
    【iOS】build diff: /../Podfile.lock: No such file or directory
    Eclipse使用Maven构建web项目
    UIScrollView增加刷新
    Mac下打开eclipse 始终提示 你需要安装Java SE 6 Runtime
    嵌入支付宝SDK,出现“LaunchServices: ERROR: There is no registered handler for URL scheme alipay”错误
    iOS开发 传感器(加速计、摇一摇、计步器)
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4630579.html
Copyright © 2011-2022 走看看