【问题标题】:Unique paths from (0,0) to (N-1, N-1) in a 2D grid with a twist具有扭曲的二维网格中从 (0,0) 到 (N-1, N-1) 的唯一路径
【发布时间】:2015-01-31 10:47:25
【问题描述】:

路径只能从 (0,0) 开始在网格中向左和向下移动。最终它需要到达 (N-1, N-1)。

如果网格是 NxN,则有 2N 个选择 N 个这样的路径,随着 N 的增加呈指数增长,并且由于内存限制,我无法将所有这些路径存储在列表中。我们还可以将每条路径编码为长度为 2^(N-1) 的位串,其中 1 是向右移动,0 是向下移动。每个编码路径中有相同数量的 0 和 1。

我得到了一个维度为 NxN 的 2D 方形网格。网格中的每个单元格都有一个非负值。我需要对每条唯一路径的所有这些值求和。我怎样才能有效地做到这一点?

【问题讨论】:

  • 通过对沿路径的单元格中的值求和?
  • 假设您有一个 30x30 的网格,您将如何有效地枚举每个唯一路径上的值的总和?
  • 使用问题空间的广度优先搜索构造所有唯一路径。沿路径对节点的值求和。
  • 由于这是一个动态规划问题,请考虑矩阵只是一个数组或 1xN 网格的更简单的情况。在这种情况下,您要查找的总和,即从 0 到数组中的第 i 个元素,只是位置 i 的累积总和。将这种方法扩展到矩阵情况很容易。所以你只需要另一个矩阵来表示累积和,计算它们应该需要线性时间。
  • @MattCoubrough,关于如何为此构建 BFS 树的任何提示?鉴于我有这棵树,我将能够对其进行预序遍历。

标签: java algorithm graph dynamic-programming


【解决方案1】:

我们称值矩阵 V,所以 V[y][x] 是单元格 (x, y) 处的值。

每条路径都从 (0, 0) 开始,到 (N - 1, N - 1) 结束。一条路径 P 的总值,value(P) 是位于 P 上的所有单元格的值之和。

问题是计算从 (0, 0) 到 (N - 1, N -1) 的所有有效路径 P 的 SUM(value(P))。

除了枚举每条有效路径之外,计算 SUM 的另一种方法是计算每个单元格 (x, y) 有多少条路径通过该单元格。如果有 i 条路径通过此单元格,则此单元格贡献的总值为 i * V[y][x]。因此,我们只需遍历网格中的每个单元格,为其计算 i(x, y),然后将 i(x, y) * V[y][x] 添加到总结果中。

如何计算 i(x, y)? i(x, y) 只是没有。通过 (x, y) 从 (0, 0) 到 (N-1, N-1) 的有效路径。提示:- 如果有一种从 (0, 0) 到达 (x, y) 的方法和 b 种从 (x, y) 到达 (N-1, N-1) 的方法,那么有 a * b 种方法可以通过 (x, y) 从 (0, 0) 到达 (N-1, N-1)。休息很容易。

【讨论】:

  • 据我了解,这会输出所有路径的总和,有没有办法分别得到每条路径的总和?谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多