矩阵的最大子阵列

时间:2013-02-05 22:01:02

标签: matrix dynamic-programming pseudocode

我正在阅读Jon Bentley的“Programming Pearls”,其中有一个我似乎无法回答的问题。这是:

在最大子阵列问题中,我们得到一个nxn实数数组,我们必须找到任何矩形子数组中包含的最大总和。

在本章中,它列出了一种查找数组最大值的算法:
    maxsofar = 0
    maxendinghere = 0
    对于i = [0,n)// n)= n-1
    / * ivariant:maxendinghere和maxsofar对于x [0 ... i-1] * /
是准确的     maxendinghere = mac(maxendinghere + x [i],0)
    maxsofar = mac(maxsofar,maxendinghere)

我正在考虑你是否可以按照一句话说些什么     对于所有列
    对于所有行
    上面显示的算法

但我不确定这会奏效。任何想法?

1 个答案:

答案 0 :(得分:2)

首先,你必须了解1d阵列版本:1d阵列的最大连续总和。

解决1d数组版本,算法很简单,你已经给出了上述。

maxsofar = 0
maxendinghere = 0
for i = [0, n)
    maxendinghere = max(maxendinghere + x[i], 0)
    maxsofar = max(maxsofar, maxendinghere)

这是O(n)。然后我们可以花费到2d版本。对于2d版本,你可以将它转换为1d版本并仍然使用上述算法,但如何?只需将一列中的值相加,并将总和视为新的1d数组。例如:

矩阵是2 * 2如下:

1 2
3 4
总结之后,你可以得到

4 6
得到了吗?你需要做的就是枚举所有可能的方法来计算从第i行到第j行的列总和。然后应用上面的密钥算法。伪代码:

for i=0 to n
    for j=i to n
        create a new array which contains the column sum from the ith row to jth row
        apply the above O(n) algorithm to get the maximum

总复杂度为O(n ^ 3)