【问题标题】:Minimal path to form a string形成字符串的最小路径
【发布时间】:2018-04-14 10:20:23
【问题描述】:

给定一个由符号S 组成的矩阵N x M 和一个给定的符号序列,找出以给定顺序遍历所有符号的最小路径。允许的路线是UP, DOWN, LEFT, RIGHT

例子:

Matrix:
   123
   265
   346
Sequence:
   1234561
Output:
   8 (start from top left corner, then D, D, R, R, U, L, U, L)

请注意,符号可以重复,因此图形算法在这里没有用处。 实际路径无关,只有数字,因此动态规划可能是要走的路。

形式上:给定的符号序列必须是路径的子序列。

我正在寻找一种能找到上述最短路径长度的算法。

【问题讨论】:

  • 能否请您在帖子末尾添加一个问题,因为不清楚您在寻找什么。
  • @Pontios 已澄清。感谢您指出这一点。
  • 我不确定我是否理解您的问题。您在寻找回溯吗?

标签: algorithm dynamic-programming theory


【解决方案1】:

动态规划状态可以是(row, col, pos):棋盘上的两个坐标和我们构建的序列中的位置。

函数f (row, col, pos)是达到这种状态的最小总距离。

显然,当matrix[row][col]不等于sequence[pos]时,状态无效。 我们将通过f (row, col, pos) = infinity对其进行编码。

f (row, col, 1) = 0 的基数为 matrix[row][col] = sequence[1]

外部循环遍历状态的pos 部分。 要在matrix[row][col] 等于sequence[pos] 的情况下找到f (row, col, pos),我们要观察所有状态(row', col', pos - 1) 并取最小值f (row', col', pos - 1) 加上(row', col')(row, col) 的距离。 这个距离就是|row - row'| + |col - col'|

答案是f (row, col, n) 的最小值,其中n 是序列的长度。

希望你能从这里拿走它。


即使实际路径是相关的,这种方法也会有所帮助。 为了找到实际路径,我们可以将先前的状态与函数值一起存储。 换句话说,f (row, col, pos) 可以是三元组:实际答案、先前状态的 row'、先前状态的 col'

【讨论】:

  • 你能澄清一下outer loop吗?我当时迷路了,因为我真的不知道你指的是什么。
  • @PalJereh 我将解决方案构造为:for pos = 2, 3, ..., n:for row = 1, 2, ..., rows:for col = 1, 2, ..., cols:calculate f (row, col, pos)。但是带有记忆的递归解决方案也可以。
  • 你提到的无穷大不应该是积极的吗?
  • @Gassa 我现在有点迷路了。带有记忆的递归解决方案不需要NxMxInputLength空间吗?以及计算例如 f(2, 2, 3)(例如上面)如何帮助找到解决方案(因为结果不会改变程序的其他变量/部分)。
  • @PalJereh 在这两种情况下,复杂度都是rows * cols * n 内存和rows^2 * cols^2 * n 时间。至于计算不需要的值,循环解决方案确实会访问一些这样的状态。如果这困扰你,有递归解决方案。通常,通过递归实现动态编程具有更高的常数因子,但访问的状态更少。哪个更强取决于问题。
【解决方案2】:

当在字符s[i] 的矩阵中使用jth 实例时,让f(i, j) 表示达到序列前缀s 的最小距离,最大长度为i。那么:

f(i, j) = min(d(c, j') + f(i - 1, j'))

for all j'

where d is the distance function
      c is the jth instance of the character s[i]
      j' is an instance of the character s[i - 1]

此解决方案的最大复杂度为O(n * (r * c) * (r * c)),因为序列中有n 个字符,每个字符最多有r * c 个实例。但对于序列中每个字符在矩阵中的实例数相对较少的输入,效率可能会显着提高。

【讨论】:

  • 这里,n * r * c 是状态数,但时间复杂度是n * r * c * r * c,因为jj' 的选择可能是r * c。一个例子是BW 方格的棋盘矩阵,以及BWBWBWBWBW...BW 序列。一个更极端的例子是字母表只包含一个字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2011-12-19
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多