【问题标题】:Find path on a matrix to get max value在矩阵上查找路径以获得最大值
【发布时间】:2016-02-10 08:08:45
【问题描述】:

我知道,这是一个老问题,如果给定一个矩阵,比如:

[1 1 2 3,
 2 3 4 4,
 3 4 1 3,
 2 1 3 4]

从给定位置开始,从右到左,只能向右或向上或向下移动,不能原路返回并停在右侧,找到一条路径以获得最大值。

我正在考虑使用 DP(可能需要尝试所有可能的路径并计算值),但它似乎会消耗大量内存,因为它存储了所有可能的解决方案,而且速度可能也很慢。

我想知道是否还有其他想法或方法可以做出更好的解决方案?如果可能,更快的解决方案?

【问题讨论】:

  • 写下你如何看待使用DP?提供有关您的解决方案的更多详细信息。就目前而言,您似乎听说在这里可以使用 dp,只是为了好看而添加了一个关于 dp 的句子。
  • 好吧,贪心算法不能用,因为可能一个地方的值太大了,所以 DP 既然是唯一的方法。
  • 这并没有说明“你如何考虑使用 DP”。
  • 如果你有开始的地方,也有结束的地方(检查点)。我认为 BFS 也可以。
  • 你从哪里开始?根据您的描述,您可以从右侧的任意位置开始并在左侧的任意位置结束。对吗?

标签: java algorithm computer-science


【解决方案1】:

我认为有一种方法可以制作 DP,但我无法快速找到它。因为目前还没有人回答,所以我给个图法。创建一个有向图,其中从 A 到 B 的边将等于该顶点中的数字。从您的描述中可以清楚地看出它不会有任何循环。你会得到一个像这样的网格图,但只是定向的:

现在得到一个位于右侧某处的顶点源并将其连接到第一层(将所有边设为 0)。与目的地相同,但它在左侧。

现在运行longest path in directed acyclic graph

【讨论】:

    【解决方案2】:

    如果您想优化内存,您可以尝试回溯。这将只涉及存储当前路径以及最佳解决方案的路径和值。

    大纲是:

    1. 您存储了一个步骤列表(右、上、下)
    2. 你可以说是深度优先,如果可以的话,试着迈出新的一步
    3. 如果您不能,只需返回一个并将步骤更改为下一个可能的方向。 (如果它比以前存储的路径更好,则存储此路径)。
    4. 如果该步骤没有下一个可能的方向,请重复 3。
    5. 如果所有可能性都用尽,则返回存储的最佳路径。

    维基百科的回溯:https://en.wikipedia.org/wiki/Backtracking

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      相关资源
      最近更新 更多