• 第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

    【解法二】

  • 相关阅读:
    国内源 maven 配置 + SSM 脚手架 整合
    Google XSS 小游戏 答案
    鉴影记录
    记录 完美解码 配置
    HttpCanary 破解 可注入 【拒绝度盘】【20200606有效】
    MyBatisCodeHelper-Pro插件破解版[2.8.2] 【拒绝度盘】
    博客园主题
    wdcp后台登陆访问失败处理方法
    分享一下自己渗透挖洞方法与思维
    服务器安装宝塔linux系统控制面板
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4630579.html
Copyright © 2020-2023  润新知