第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

【解法二】

时间: 2024-08-06 07:57:31

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

数字之魅:子数组之和的最大值[二维]+[三维]

题目:如何求出一个二维数组中的最大子数组之和. 方案一:暴力破解-枚举法.对于一个二维数组我们列举出每一个子数组值的大小,然后进行比较,这样就可以得到最大的和了.其时间复杂度为:O(N*N*M*M*Sum的时间复杂度)[N表示行数,M表示列数,Sum是求解子矩阵的和].由于Sum函数求和也是采用循环,足见这个时间复杂度可是相当的大. 方案二:先计算出以左上角的元素(1,1)和当前元素(i,j)为顶点对的子矩阵的部分和,部分和的计算如下图(一)所示,我们可以看出:以(i_min,j_min),(i

第2章 数字之魅——求数组的子数组之和的最大值

求数组的子数组之和的最大值 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter2shuzizhimei.maxsumsubarray; 2 /** 3 * 求数组的子数组之和的最大值 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class MaxSumSubArray1 { 9 //求数组的子数组之和的最大值 10 public static double maxSum(double a[]){ 11 double

编程之美 2.14求数组的子数组之和的最大值

对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值. 如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6. 方法一:暴力 循环遍历,输出所有,判断最大的和 1 #include"iostream" 2 #define MAX 1001 3 using namespace std; 4 5 int main(){ 6 int n, a[MAX], sum , maxsum ; 7 8 cin &

编程之美之2.14 求数组的子数组之和的最大值

[题目] 一个有N个整数元素的一维数组(A[0],A[1],A[2],...A[n-1]),这个数组中当然有很多子数组,那么子数组之和的最大值是多少? 该子数组是连续的. 我们先来明确一下题意: (1)子数组意味着是连续的. (2)题目只需要求和,并不需要返回子数组的具体位置. (3)数组的元素是整数,所以数组可能包含正整数,负整数或者零. 举几个例子: 数组:[1,-2,3,5,-3,2]返回8 数组:[0,-2,3,5,-1,2]返回9 数组:[-9,-2,-3,-5,-3]返回8 [解法一

编程之美2.14 求数组的子数组之和的最大值

问题描述: 一个有N个整数元素的一维数组(A[0], A[1], A[2],...,A[n-1]),这个数组当然有很多子数组,那么子数组之和的最大值是什么呢? 解法: 1. 暴力解法-------O(N^3) 2. 改进版暴力解法-------O(N^2) *3. 分治算法-------O(NlogN)(暂时未去实现) 4. 数组间关系法-------O(N) 具体思路和代码: 1.暴力解法 思路:Sum[i,...,j]为数组第i个元素到第j个元素的和,遍历所有可能的Sum[i,...,j].

求数组的子数组之和的最大值?

自己写的代码考虑未周全,引入了额外的空间复杂度: //求数组的子数组之和的最大值 #include <iostream> #define N 12 using namespace std; int main() { //int a[]={-5,2,3,-3,-2,3,1,-5}; //int a[]={-5,2,0,3,-2,3,4,5}; int a[]={1,-2,3,10,-4,7,2,-5}; int flag,max,i,j=0; int sum[N]={0}; //(1)记录子数组

编程之美读书笔记2.14 - 子数组之和的最大值

http://blog.csdn.net/pipisorry/article/details/39083281 问题: 1. 一个由N个整数元素的一维数组,求其所有子数组中元素和的最大值. 2. 如果数组首尾相邻,也就是允许子数组A[i],...,A[n-1],A[0],...,A[j]存在,求其所有子数组总元素和的最大值. 解法1: /* O(n^2) 遍历算法 */ static int maxSubarraySum1(int *a,int a_len){ int max_sum = INT

2.14 求数组的子数组之和的最大值

题目:给定一个一维数组,求这个数组的子数组之和的最大值. 最佳方法:动态规划! 一. 可以将一个大问题(N个元素数组)转化为一个较小的问题(N-1个元素数组).. 假设已经知道(A[1],...A[n-1])中最大的子数组的和为:All[1] 并且已经知道(A[1],...A[n-1])中包括A[1]的子数组的最大和为start[1] 所以最终的解All[0] = max(A[0], A[0]+start[1], All[1]) 所以通过DP来求解! 代码如下: #include <iostre

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

题目:给定一个二维数组,求这个二维数组的子数组之和的最大值. 分析:将二维降低到一维的情况. 代码: #include <iostream> const int MAXN = 10000; const int INF = 100000000; using namespace std; int B[MAXN][MAXN], PS[MAXN][MAXN]; int n, m; int BC(int first, int last, int liehao) { return PS[last][lie