This question already has answers here:
(2个答案)
可能重复:
Finding a submatrix with the maximum possible sum in O(n^2)
我有一个nxn矩阵。我想找出一个MXM子矩阵,它的元素之和最大,上面的矩阵。
有效的算法是什么。
最佳答案
我有一个算法,当放大M时在恒定时间内运行,当放大N时在二次时间内运行。
第一个子阵照常计数。把总数存起来然后向右移动一行字段-两个MxM矩阵重叠,这样您就可以对两个不重叠的列求和把所有的钱都存起来。现在您可以为该行选择最大的和。
移到下一行。还记得省下的钱吗?第一行和第二行的MxM矩阵再次重叠,因此您只需对MxM矩阵的第一行和最后一行求和,然后计算第二行的第一和。
现在转到第二行的第二和。执行与上面相同的操作,但您会发现第二行中第一和的最后一行和第二和再次重叠。
我知道这有点混乱,如果你不明白,让我知道我会画一些图片该算法基于this answer中的论文。
编辑:我知道我答应过拍照片,但这应该足够了:
A AB AB AB AB B
ac qian ji bao ji bao ji bao ji bao ji bd空调
ac qian ji bao ji bao ji bao ji bao ji bd空调
AC qian ji bao ji bao ji bao ji bao ji BD空调
AC qian ji bao ji bao ji bao ji bao ji BD空调
C CD CD CD CD D
这是四个子舰队,A,B,C,D,位置如下:
AB公司
光盘
首先计算子矩阵的和:和(a)。这里没有优化现在要计算B:sum(B)的和您可以执行与a中相同的操作,但请注意a和b重叠。因此,将sum(a)赋给sum(b),计算垂直向量A AC AC AC AC
的和,并从sum(b)减去if,然后计算垂直向量B BD BD BD BD
的和并将其添加到sum(b)。
和(b)=和(a)-和(a ac ac ac ac ac ac)+和(b bd bd bd bd bd)
你有总数(B)现在你可以继续计算整个子粒子的第一行。
移到第二行:matices C和D。您不必对整个maticec求和,因为在前一行中,您保存了sum(A)注意它们再次重叠。你只需要加上a和c的区别:
//代码(1)
subc=和([a ab ab ab ab])//作为减法c
add c=sum([c cd cd cd])//作为add c
sum(C)=sum(A)-subC+addC
你有总数(c)。现在你可以得到这样的总和:
//代码(2)
subd=和([ab ab ab b])//作为减法d
add d=sum([cd cd cd d])//作为add d
sum(D)=sum(B)-subD+addD
但是比较subd和subc,addd和addc。它们重叠了!所以你可以这样做:
//代码(3)
subd=subc-a+b//a上的subc substract值加上b
addd=addc-c+d//同上
sum(D)=sum(B)-subD+addD
你看,不是25个方向计算一个子阵的和,而是6个方向对于每一个可能大小的mxm,我们有第一个子矩阵的mxm aditions,第一行和第一列的m*2+2 aditions,其余的6个aditions。
关于c++ - 寻找总和最大的子矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5402432/