以下是我在面试论坛上遇到的一个问题:
你有一个填充0和1的数组。 0代表燃烧的熔岩, 1表示垫脚石。你从一开始就开始了 数组,你想找到最快的方式到达终点。在每一个 时间步长,您可以将速度V增加或减少1, 或者你可以跳到V步之遥的垫脚石。你想达到 阵列的末端没有超调。
解决此问题的好算法是什么?
我尝试了一些事情(主要是使用动态编程和递归),但我无法找出导致非指数算法的最佳子结构。有什么想法吗?
答案 0 :(得分:1)
在每个步骤中,您有两个选择:增加速度,或不增加速度。然后,对于这些选项中的每一个,您最终都会在不同的步骤中重复选择。也许你可以看到这里出现的树形图案。树中的每个节点都是一个步骤,每个边都是一个选择。每个节点(步骤)都有两个边(选项),因此它是二叉树。
另请注意,如果您步行 x 且速度为 V ,那么您到达那里的方式并不重要,以下结果将是相同。所以在这里你可以优化一下。 (例如,使用动态编程。)
蛮力的方法是想象这棵树并进行深度优先搜索,直到你完全到达结束步骤。可能有多个解决方案,最快的解决方案是 解决方案。
答案 1 :(得分:1)
动态编程是正确的方法。
您的搜索空间是二维的:当前位置是您的第一个维度,当前速度是第二个维度。这意味着您需要一个2D数组best[N][N]
,其中N
是布尔数组中的项数。 best[s,v]
处的值表示以s
的速度到达v
位置所需的最小步数。检查搜索空间的每个点,检查是否可以使用当前速度到达垫脚石。如果答案为“是”,请在搜索空间中设置相应的位置。同时设置相邻速度的点数。答案是在best[N-1][0]
位置。