考虑这个样本时序矩阵:(nxn)
{
{0, 2, 2, 2, -1},
{9, 0, 2, 2, -1},
{9, 3, 0, 2, -1},
{9, 3, 2, 0, -1},
{9, 3, 2, 2, 0}
}
行0和n分别是起始位置和结束位置。
请考虑下表,以获得针对上述特定情况的解决方案:
Start End Delta Time
- 0 - 1
0 4 -1 2
4 2 2 0
2 4 -1 1
4 3 2 -1
3 4 -1 0
之后没有我可以访问的特定节点,因此解决方案是2, 3
(因为0和4是开始和结束,必须访问)
我无法为此找到最佳的非暴力算法。
Input: int[][] Timing Matrix, int Time
Output: int[] Visitable Nodes
答案 0 :(得分:0)
最佳非暴力
在最佳和蛮力之间,有很多可能性。我不知道最佳解决方案是什么样的,但我可以提出一个改进而不是蛮力。
Bruteforcing意味着尝试所有可能的路径。这些路径的数量取决于距离,并且由于允许节点重新访问,事情变得更加复杂。忽略这些复杂性,我们可以天真地说有n!
个路径需要尝试。
一个微不足道的观察是两个部分路径
start -> a -> b -> c
和
start -> b -> a -> c
仅在最终可用时间有所不同。因此,对于每组访问节点(此处:{a, b, c}
)和最终节点(此处:c
),您只需跟踪所需的最短时间。这会将天真的复杂性估计值降低到2**n * n
,这仍然很糟糕但更好。
关于实施,我要定义
class State {
final ImmutableSet<Node> visitedNodes;
final Node finalNode;
...
}
Map<State, Integer> bestTimeMap;
并使用它来停止递归,如果在上一次访问具有相同或更好的时间时重新访问状态。