Matrix 矩阵的最大子阵

Matrix 矩阵的最大子阵,matrix,dynamic-programming,pseudocode,Matrix,Dynamic Programming,Pseudocode,我目前正在读乔恩·本特利的《编程珍珠》,其中有一个问题我似乎无法回答。这是: 在最大子阵问题中,我们得到一个nxn实数数组,我们必须找到任何矩形子阵中包含的最大和。 在本章中,它列出了一种求数组最大值的算法: maxsofar=0 maxendinghere=0 对于i=[0,n)//n)=n-1 /*变量:maxendinghere和maxsofar对于x[0…i-1]*/ maxendinghere=mac(maxendinghere+x[i],0) maxsofar=mac(maxsofa

我目前正在读乔恩·本特利的《编程珍珠》,其中有一个问题我似乎无法回答。这是:

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

在本章中,它列出了一种求数组最大值的算法:
maxsofar=0
maxendinghere=0
对于i=[0,n)//n)=n-1
/*变量:maxendinghere和maxsofar对于x[0…i-1]*/
maxendinghere=mac(maxendinghere+x[i],0)
maxsofar=mac(maxsofar,maxendinghere)

我在考虑你是否可以说些类似于
对于所有列
对于所有行
上面显示的算法


但我不确定这是否可行。有什么想法吗?

首先,你必须了解一维数组的版本:一维数组的最大连续和

为了解决一维阵列问题,该算法非常简单,上面已经给出了u

maxsofar = 0
maxendinghere = 0
for i = [0, n)
    maxendinghere = max(maxendinghere + x[i], 0)
    maxsofar = max(maxsofar, maxendinghere)
这是O(n)。然后我们可以扩展到2d版本。对于2d版本,u可以将其转换为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)