关闭

二维数组最大子矩阵的求和

489人阅读 评论(0) 收藏 举报

问题描述:已知一个n*n的二维数组a[n,n],每个元素都是整数(可能小于0),求其子矩阵元素的最大和

 

问题分析:

这个问题来自一维数列最大子序列的求和问题,因此必须对一维数列最大子序列的求和有充分的了解才有讨论基础,不了解的请参考《编程珠玑》第8章或《算法导论》的有关章节。该文中给出了5种算法,其中算法1野蛮求和的复杂度为O(n^3),算法2和算法3都利用了已有的计算结果减少重复计算其复杂度为O(n^2),算法4采用分治算法复杂度为O(n*lg(n)),算法5采用扫描算法实现了O(n)的复杂度。

可以将一维数列的算法1直接扩展到二维,这样整个算法的复杂度将变成O(n^6),原因:子矩阵左上角的位置有O(n^2)的可能,右下角的位置也有O(n^2)个可能,计算子矩阵的和也需要累加O(n^2)次,因此合计复杂度为O(n^6)。

我们也可以将算法3直接扩展到二维,预先将每一行的0..i的和保存个一个临时的二维数组中,将每一列的0..j的和也保存一个临时的二维数组中,这样就可以快速求出子矩阵的和,整个算法的复杂度为O(n^4)。

另外一个效率更高的方法是将算法3和算法5结合,首先求出每行的临时累加结果,记为t[i,j] = a[i,0]+a[i,1]+...+a[i,j])。然后针对每个(x,y)(x<y)整数对,显然对于每个0<=i<n,s[i] = t[i,y]-t[i,x]就是a[i,x]+a[i,x+1]+...+a[i,y]的和,按照纵向,对所有的n个s[i],可以利用算法5在O(n)的时间内求出其最大子序列的和,这个最大和就是以x,y为左右坐标的最大子矩阵的和。对所有的x,y的组合求出其最大子矩阵的和,就得到了最终结果。上述算法的时间复杂度为O(n^3)。

0
0
查看评论

对二维数组的某一字段求和

方法一: array_sum(array_map(create_function('$val', 'return $val["size"];'), $arr)); 方法二: array_sum(array_map(function($val){r...
  • moqiang02
  • moqiang02
  • 2014-08-27 21:29
  • 3048

二维数组和最大的子矩阵

题目:给出一个 m*n 的二维矩阵(元素可为正可为负),求该二维矩阵的一个子矩阵,且此子矩阵中所有元素的和最大,并输出该矩阵的和。方法1: i到j行的数组相加,得到一个一维数组。在整个一维数组上求和最大的连续子数组。#include <iostream> using namespace...
  • gao1440156051
  • gao1440156051
  • 2015-02-05 22:33
  • 1360

最大子矩阵求和问题

给定一个N*N的矩阵,计算最大子矩阵和。 思路: 最大子段和问题可以用动态规划在O(n)内解决,该题可以借助最大子段和的解法来做。我们考虑第i行到第j行的子矩阵,可以将i ~ j行的矩阵合并为一个一维数组,即把每列对应的数相加,那么这个一维数组的最大子段和就是原子矩阵的最大和。 我们用一个二维数组...
  • yusiguyuan
  • yusiguyuan
  • 2013-10-19 22:42
  • 8578

关于python实现二维数组所有元素求和

今天遇到一个需求,求二维数组的和,尽量在一行代码中完成:    关于二维数组求和的几种方法:    a = [[1,2],[3,4],[5,6]]    1.sum(map(sum,a)) #first, map(fu...
  • zjm750617105
  • zjm750617105
  • 2016-04-17 14:12
  • 5114

【动态规划】求二维矩阵的最大和子矩阵

题目描述: 有一个正整数和负整数组成的NxN矩阵,请编写代码找出元素总和最大的子矩阵。请尝试使用一个高效算法。 给定一个int矩阵mat和矩阵的阶数n,请返回元素总和最大的子矩阵的元素之和。保证元素绝对值小于等于100000,且矩阵阶数小于等于200。 测试用例: [[1,2,-3],[3,4...
  • u012351768
  • u012351768
  • 2016-05-30 21:06
  • 3095

PHP中计算二维数组中某一元素之和

php中计算二维数组中某一元素之和
  • qq_33867131
  • qq_33867131
  • 2017-10-16 09:42
  • 408

二维数组的行列求和以及最大差值

#include int cmp(void const *a,void const *b) {     return *(int*)a-*(int*)b; } int main() {     int a,b;     while(1) &...
  • ahstunwy
  • ahstunwy
  • 2016-04-14 12:44
  • 205

二维数组对角线的和

int a[][3]={9,7,5,3,1,2,4,6,8};          int s1=0;     int s2=0;     for (int i=0; i3; i++) ...
  • u012189584
  • u012189584
  • 2014-09-11 15:22
  • 694

Java算法——二维数组的遍历,求和

public class Array2BianLi { public static void main(String[] args) { int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int sum = 0; S...
  • beyond1123
  • beyond1123
  • 2016-08-10 22:08
  • 5089

ACM-最大子矩阵和

最大子矩阵和问题是对最大子序列和问题的扩展,即从一维扩展到了二维。但是解决此问题的方法和原来的方法并没有太大的差别,这里就以同样的动态规划的实录思路来求解此问题。原来subSum[i]代表包含ai并且以ai结束的子序列的最大和,状态转移方程为subSum[i+1] = subSum[i]<0 ...
  • u011787119
  • u011787119
  • 2015-03-30 23:40
  • 1418
    个人资料
    • 访问:6334次
    • 积分:216
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:0篇
    • 译文:2篇
    • 评论:0条