我需要一些关于如何解决以下问题的想法(不是解决方案)。 所以有一个人需要到达建筑物右上角的电话。保证他们将在那个位置。我们必须找到他能够到达那里的最短路径。有关示例,请参见图像。
首先想到的是使用Dijkstra的算法。但是,我被告知这是不必要的,并且有更简单的替代方案。
另一方面,如果它是最后的选择,如果有人可以指导我,我不会介意使用Dijkstra的算法。我对图论没有太多的先验知识,尽管我能胜任我使用的语言(C ++)。
说明: 他把自动扶梯从一楼的左侧带到一楼的右侧(14秒); 他从右侧向左冲刺一楼(5秒); 他把自动扶梯从一楼的左侧带到二楼的右侧(13秒); 他将自动扶梯从二楼右侧带到顶层左侧(11秒); 他从顶层的左侧跑到右侧(5秒钟)来接听电话! 从前门到售楼处的总时间为14 + 5 + 13 + 11 + 5 = 48秒。
输入将按以下格式指定: 每行每行包含由单个空格分隔的三个整数lfr,其中l表示从当前楼层的左侧到楼层右侧所需的秒数,f表示从从地板的一侧延伸到另一侧,以及从地板的右侧到地板的左侧行进的秒数。
示例输入:
14 10 15
13 5 22
13 7 11
5
答案 0 :(得分:2)
这是一个DP问题。
f[n][left] = min{f[n-1][left] + time[go_from_left_to_right_on_floor_n-1] + time[escalator_from_right_side_up],
f[n-1][right] + time[escalator_from_right_side_up]}
f[n][right] = min{f[n-1][right] + time[go_from_right_to_left_on_floor_n-1] + time[escalator_from_left_side_up],
f[n-1][left] + time[escalator_from_left_side_up]}
如果你想去左边的三楼,你可以从二楼开始,左侧,右侧,然后乘坐自动扶梯;或从二楼开始,右侧,乘坐自动扶梯。选择使用最少时间的方式,并继续使用循环(或递归:))
解决方案应为 O(n)
答案 1 :(得分:-1)
如果问题与你发布的问题一样小,我猜choyukchow的答案会有效。 但是如果问题变得非常大,你可能想要使用启发式算法。示例here。