子数组之和的最大值(二维)
2013-08-12 15:01
169 查看
二维情况下,定义“部分和”PS[i][j]等于以(1,1),(i,1),(1,j),(i,j)为顶点的矩形区域的元素之和。则以(i_min,j_min),(i_min,j_max),(i_max,j_min),(i_max,j_max)为顶点的矩形区域的元素之和,等于PS[i_max][j_max]-PS[i_min-1][j_max]-PS[i_max][j_min-1]+PS[i_min-1][j_min-1]。(可以想象)。对于求解部分和,也能以O(1)时间得到新的部分和,PS[i][j]=PS[i-1][j]+PS[i][j-1]-PS[i-1][j-1]+B[i][j],其中B[i][j]为矩阵中第i行第j列的元素(下标从1开始)。因此用O(N*M)时间复杂度可以处理所有部分和。故算法总时间复杂度为O(N*N*M*M)。
进一步解法:枚举矩形上下边界(左右也可以),然后用一维情况下的方法确定左右边界,就可以得到二维问题的解(将BC(a,c,i)看成是一维里的一个元素)。新方法时间复杂度为O(N*N*M)。BC(a,c,i),表示在第a行和第c行之间的第i列的所有元素的和,显然可以通过“部分和”在O(1)时间内计算出来,它等于PS[c][i]-PS[a-1][i]-PS[c][i-1]+PS[a-1][i-1]。(这些PS在前面的计算中以及获得)
通过选择枚举上下或左右可以使时间复杂度变为O(N*M*min(N,M))。
进一步解法:枚举矩形上下边界(左右也可以),然后用一维情况下的方法确定左右边界,就可以得到二维问题的解(将BC(a,c,i)看成是一维里的一个元素)。新方法时间复杂度为O(N*N*M)。BC(a,c,i),表示在第a行和第c行之间的第i列的所有元素的和,显然可以通过“部分和”在O(1)时间内计算出来,它等于PS[c][i]-PS[a-1][i]-PS[c][i-1]+PS[a-1][i-1]。(这些PS在前面的计算中以及获得)
通过选择枚举上下或左右可以使时间复杂度变为O(N*M*min(N,M))。
相关文章推荐
- 数字之魅:子数组之和的最大值[二维]+[三维]
- 返回一个二维整数数组中最大子数组的和
- 编程之美读书笔记2.15 - 子数组之和的最大值(二维)
- 结对开发之返回一个二维整数数组中最大联通子数组的和
- 返回一个二维整数数组中最大子数组的和
- 返回一个二维整数数组中最大联通子数组的和
- 返回一个二维整数数组中最大联通子数组的和
- 返回一个二维整数数组中最大联通子数组的和
- 第2章 数字之魅——子数组之和的最大值(二维)
- 一个H行L列的二维矩阵数组(整形),求每行的元素总和,并输出最大的那一行的总和
- HDU1003+数组最大子序列和及其扩展(循环数组,二维矩阵等)
- 连续子数组的最大和问题(一维和二维)To the Max (POJ 1050)
- 结对开发之《返回一个二维整数数组中最大子数组的和》
- 返回一个二维整数数组的最大联通子数组的和
- 题目:返回一个二维循环数组中最大子矩阵的和
- 返回一个二维循环数组中最大子矩阵的和
- 求二维整数数组中最大联通子数组的和
- 结对开发之二维环数组求最大子数组的和4
- 面试经典(6)--连续子数组最大和--二维
- 返回一个二维整数数组中最大联通子数组的和