任何人都可以帮我解决这个问题吗? 我们有一些来自某些特定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中的城镇,并且从最优子路径构建使用动态编程的最佳最终路径。问题是你可能以许多可能的结束字符结束,而我完全不知道如何从较小的最佳子路径构造更长的最佳路径。
答案 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).
让我知道我需要进一步澄清哪些步骤。