繁体   English   中英

如何获得O(n)中2D数组的最大和?

[英]How to get the biggest sum in 2D array in O(n)?

我需要计算2D数组中可能的最大和,但代码的效率必须为O(n)。 n是数组中数字的数量。

该数组就像楼梯,用户只需要输入N个数字即可。 我们不需要检查它是否是有效数字。

数字将以如下形式显示在数组中:

1个

2 3

4 5 6

7 8 9 10

每行中都有一个数字。

您需要从第一行或最后一行开始获得最大的求和路径。 在每次迭代中,您只能向下移动一级,也可以沿对角线向下,向左/向下和向右移动一级。

这意味着如果您从第一行开始,则可以转到2或3。假设您输入2; 现在您只能进入4或5。如果选择5,则只能进入7或8或9。或者如果要,可以进入1> 3> 6> 8,但是不能进入1> 2。 > 6> 10,因为2未与6连接。

您也只能连续选择一个号码。 您不能去1> 2> 3> 6> 8> 9> 10之类的。

我们也可以更改单元格的值,但是路径必须相同。 这意味着我可以将例如9更改为50,但这将不是很好,因为它不是原始数组中的好路径。 (此数组中的最大和路径为1> 3> 6> 10,因此我无法转到其他单元格)

我的问题是我需要此代码以O(n)的效率运行。

我尝试从最后一行开始,检查它可以通过的所有有效路径,并尝试在所有可能的情况下以最大的方式进行尝试。 第一个不是O(n)效率,第二个可能得到错误的答案。

我还尝试从第一行开始进行操作,并扫描和比较所有步骤,但同样不是O(n)效率。

只是为了确保,我并没有要求任何人为我编写代码,只是为了帮助我确定什么是计算它的最佳方法。

顺便说一句,几乎没有评论,想补充一点,我需要打印最大路径总和,而不是路径本身。

您可以从下至上确定最大金额。 例如,下面两行是:

  4   5   6
 / \ / \ / \
7   8   9  10

现在将最大可能的总和累加到第二行但最后一行:

 12  14  16
 / \ / \ / \
7   8   9  10

举个例子,在节点4上,您可以从7或8取的最大值是12。继续此操作,但使用最大和值到顶部:

     20
     / \
   16  19
   / \ / \
 12  14  16
 / \ / \ / \
7   8   9  10

顶部节点现在具有最大可能的总和:1 + 3 + 6 + 10 ==20。这种方法将破坏原始数据(因为它会用最大和覆盖),并且不会给您路径,只有最大和的值。

在这里,三角形数组看起来像一棵树,但您实际上并没有构建一棵树:可以很容易地通过链接的位置来描述链接。

编辑 :我现在意识到这并不能完全解决您的问题,因为它省略了向左的可能步骤,但是原理仍然很好:从下至上累积最大可能的和,除了您需要考虑下面的三个值,而不仅仅是两个。 (我有点想重绘ASCII树。:-)

编辑II :正如@rpattiso指出的那样,通过从顶部开始跟踪三个可能的子节点的最大和,您可以在累积树中获得最佳路径。

编辑III :当您将矩阵视为阶梯并考虑每个节点的三个子代时,图形将变为:

  20
   | \
  16  19
   | X | \
  12  14  16
   | X | X | \
   7   8   9  10

在此, X表示两条交叉路径。 请注意,第一列是一种特殊情况,因为该列中的节点只有两个子节点。

如果m是行数, n = m*(m + 1)/2是单元格数,并且如果您的数组由二维C样式数组a[row][col] ,则最大-sum算法为:

int row = m - 1;

while (row--) {        
    a[row][0] += max(a[row + 1][0], a[row + 1][1]);

    for (int col = 1; col < row + 1; col++) {
        int a1 = a[row + 1][col - 1];
        int a2 = a[row + 1][col];
        int a3 = a[row + 1][col + 1];

        a[row][col] += max(a1, a2, a3);
    }
}

您的最大和为a[0][0]

一种选择是通过放置相关边来准备有向图,添加宿节点并将Dijkstra从1运行到宿节点。 虽然不会是线性的(接收器节点是连接到7 8 9 10的那个),另一种解决方案可能是动态编程,自底向上(在第一个答案中描述)或自顶向下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM