这是一个很大的问题,但我有点卡住了!
我想知道这个问题或类似问题是否有名称。
我可能过于复杂地找到了解决方案,但是如果没有完整的暴力搜索(我当前的实现),我想不出办法。这对于所涉及的申请是不可接受的。
我想知道是否有任何方法可以简化这个问题,或者我可以采用的实施策略(语言/工具选择是开放的)。
以下是该问题的简要说明:
给定 n 长度 k 的序列:
a = [0, 1, 1] == [a1, a2, a3]
b = [1, 0, 2] == [b1, b2, b3]
c = [0, 0, 2] == [c1, c2, c3]
通过序列找到长度 k 的路径(我将给出从a1开始的示例,但希望您能够了解相同的路径需要从b1,c1派生)
a1 -> a2 -> a3
a1 -> b1 -> b2
a1 -> b1 -> a2
a1 -> b1 -> c1
a1 -> c1 -> c2
a1 -> c1 -> a2
a1 -> c1 -> b1
我想知道哪条路径的总和最低:
a1 -> a2 -> a3 == 2
a1 -> b1 -> b2 == 1
a1 -> b1 -> a2 == 2
a1 -> b1 -> c1 == 1
a1 -> c1 -> c2 == 0
a1 -> c1 -> a2 == 1
a1 -> c1 -> b1 == 1
所以在这种情况下,样本 a1 - > c1 - > c2是最低的。
编辑:
抱歉,只是为了清除导出路径的规则。 例如,如果您尚未用尽 b2 ,则可以从节点 a1 移动到 b2 ,并且已经耗尽了该序列中的上一个节点(的 B1 )。
答案 0 :(得分:1)
假设数组以矩阵A
给出,使得每一行与原始数组之一相同。您的矩阵大小为(n+1)x(k+1)
,并确保A[_][0] = 0
现在,使用DP解决它:
f(x,y,z) = min { f(i,y,z-1) | x < i <= n} [union] { f(i+1,0,z) } + A[x][y]
f(_,_,0) = 0
f(n,k,z) = infinity for each z > 0
想法:在每个步骤中,您可以选择转到以下每一行(同一列) - 或转到下一列,同时减少所需的更多节点数。
转移到下一列是通过虚拟索引A[_][0]
完成的,不需要减少需要更多而且没有成本的节点数,因为A[_][0] = 0
。
<强>复杂度:强>
这个解决方案基本上是一种蛮力,但是使用对f(_,_,_)
每个已经探索过的值的记忆,你基本上只需要填充一个大小为O(n*k^2)
的矩阵,其中每个单元格需要{{1}在第一次观察时计算的时间 - 但实际上可以在每步的O(1)中迭代计算,因为你只需要用行 1 中的新元素进行最小化。这使你O(n)
- 比蛮力更好。
(1)这是由O(n*k^2)
完成的,我们已经知道min{x1,x2,x3,...,xk} = min{x_k, min{x1,...,k_k-1}}
答案 1 :(得分:0)
您可以实现A *算法的修改版本。
** 在上面的伪代码上实现A algorithem。