【问题标题】:Shortest keyboard distance typing最短键盘距离打字
【发布时间】:2015-06-18 02:18:55
【问题描述】:

谁能帮我解决这个问题? 我们有一个来自某些特定 aplhabet 的 MxN 个字符的网格,例如 S={A,B,C,D}。 光标位于 (1,1) 位置,我们可以使用箭头键移动光标,updownleft、右,然后按回车选择角色(就像在旧游戏中选择昵称)。给定来自 aplhabet S 的一些输入字符串,它们加权相同的最小操作成本是多少(例如,向右移动与选择字符的成本相同)?矩阵中也可以多次出现同一个字符。

例子:

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

矩阵:

ABDC CADB ABAA

并输入字符串ADCABDA。

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

【问题讨论】:

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


    【解决方案1】:

    你应该用这样的节点构造一个图:

    A1 A1 A1 A2 D1 C1 A2 B1 D1 A2 开始 A3 D2 C2 A3 B2 D2 A3 结束 A4 A4 B3 A4 A5 A5 A5

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

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

    【讨论】:

      【解决方案2】:

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

      进一步解释。您从位置 (0, 0, 0) 开始。第一个字母是“A”。您可以尝试所有 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).
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 2010-10-25
        • 2021-09-09
        相关资源
        最近更新 更多