最短的键盘距离输入

时间:2015-04-12 20:01:53

标签: math graph dynamic-programming shortest-path traveling-salesman

任何人都可以帮我解决这个问题吗? 我们有一些来自某些特定aplhabet的MxN字符网格,例如S = {A,B,C,D}。 光标位于(1,1)位置,我们可以使用箭头键移动光标,向上向下向左,< strong>正确,按Enter 选择字符(就像在旧游戏中选择缺口一样)。考虑到来自aplhabet S的一些输入字符串,在加权相同的情况下,操作的最低成本是多少(例如,向右移动与选择字符的成本相同)矩阵中也可能存在多个相同字符的出现。

示例:

字母S = {A,B,C,D}

矩阵:

ABDC CADB ABAA

并输入字符串ADCABDA。

我的不完整解决方案是: 构造有向网格图并找到从1,1到最终字符的最短路径,其中间的字符类似于TSP中的城镇,并且从最优子路径构建使用动态编程的最佳最终路径。问题是你可能以许多可能的结束字符结束,而我完全不知道如何从较小的最佳子路径构造更长的最佳路径。

2 个答案:

答案 0 :(得分:0)

您应该使用如下节点构建图形:

       A1          A1          A1
       A2  D1  C1  A2  B1  D1  A2
Start  A3  D2  C2  A3  B2  D2  A3  End
       A4          A4  B3      A4
       A5          A5          A5

其中有一些边将一列中的每个节点连接到下一列中的每个节点。 Start(1,1)End为任何地方。边缘权重是每对密钥之间的“出租车”距离。

现在这是一个相当简单的动态编程问题。你可以从两端开始;从Start开始,概念上可能更简单。跟踪到目前为止到达每个节点的最低成本。

答案 1 :(得分:0)

你可以使用3D动态编程,其中每个状态是(x,y,l) - (x,y)代表当前位置,l代表你所在的字母。

进一步解释。你从位置(0,0,0)开始。第一个字母是&#34; A&#34;。您可以尝试所有的A,我们知道距离将是曼哈顿距离(http://en.wikipedia.org/wiki/Taxicab_geometry)。 (0,0,0)的解决方案将是所有可能性中的最小值。

在每个步骤重复上述过程。注意记忆每一步的重要性。在下面的示例代码备忘录充当函数,您将在现实中使用数组。

以下是示例伪代码:

f(x, y, l):
  if memo(x, y, l) != -1: 
    return memo(x, y, l)   # Check if already calculated.
  if l == length(word): 
    return memo(x, y, l) = 0   # Ending condition.

  memo(x, y, l) = inf
  next_letter = word[l]
  for each (x2, y2) in grid that contains next_letter:
    distance = |x2 - x| + |y2 - y|
    next_calc = f(x2, y2, l+1)
    memo(x, y, l) = min(memo(x, y, l), distance + next_calc)

  return memo(x, y, l)


Set all memo to -1, so we know that no states are calculated.

Solution is f(0, 0, 0).

让我知道我需要进一步澄清哪些步骤。