Matrix 矩阵的最大子阵
我目前正在读乔恩·本特利的《编程珍珠》,其中有一个问题我似乎无法回答。这是: 在最大子阵问题中,我们得到一个nxn实数数组,我们必须找到任何矩形子阵中包含的最大和。 在本章中,它列出了一种求数组最大值的算法: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
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)