java - 2D 网格中从 (0,0) 到 (N-1, N-1) 的独特路径,具有扭曲

标签 java algorithm graph dynamic-programming

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

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

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

最佳答案

我们将值矩阵称为 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 条路径经过该单元格,则该单元格贡献的总值(value)为 i * V[y][x]。因此,我们只需循环遍历网格中的每个单元格,为其计算 i(x, y),然后将 i(x, y) * V[y][x] 添加到总结果中。

如何计算 i(x, y)? i(x, y) 就是编号。从 (0, 0) 经 (x, y) 到 (N-1, N-1) 的有效路径。提示:- 如果有一种方法从 (0, 0) 到达 (x, y),有 b 种方法从 (x, y) 到达 (N-1, N-1),则有 a * b 种方法从 (0, 0) 经 (x, y) 到达 (N-1, N-1)。休息很容易。

关于java - 2D 网格中从 (0,0) 到 (N-1, N-1) 的独特路径,具有扭曲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27262125/

相关文章:

haskell - 图库的 xml 树解析器 (Haskell)

java - JPA 中带有 IN 子句的位置参数

java - 如何更改显示的布局

arrays - 是否总是可以在所有维度上对多维数组进行排序?如何?

c# - 如何用这种方法计算几本书的接近度?

java - 给定一个无限序列,将其分成多个区间,并返回一个新的无限序列,每个区间的平均值

algorithm - 广度优先搜索 : the timing of checking visitation status

algorithm - 在有向图中找到所有可能路径中的公共(public)路径

java - Liquibase ChangeSet 与 runAlways 不由 liquibase.update 执行

java - 如何将短数组转换为字节数组?