【问题标题】:Maximum subarray of matrix矩阵的最大子数组
【发布时间】:2013-01-20 23:39:43
【问题描述】:

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

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

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

我正在考虑您是否可以直接说以下内容
对于所有列
所有行
上面显示的算法

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

【问题讨论】:

    标签: matrix dynamic-programming pseudocode


    【解决方案1】:

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

    解决一维数组版本,算法很简单,你已经在上面给出了。

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

    这是 O(n)。然后我们可以扩展到 2d 版本。对于 2d 版本,您可以将其转换为 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多