【发布时间】:2018-07-10 04:24:47
【问题描述】:
我收到了这个面试问题并被卡住了:
从 0 号车站开始,有无数个火车停靠站。
火车的数量是无限的。第 n 列火车在 k 介于 0 和无穷大之间的所有 k * 2^(n - 1) 个站点停靠。
当n = 1时,首班列车停靠在0、1、2、3、4、5、6等站点
当n = 2时,第二列火车停靠在0、2、4、6、8等站点
当n = 3时,第三列火车停靠在0、4、8、12等站台
给定起点站号和终点站号,返回它们之间的最小停靠点数。您可以使用任何一种列车从一站到另一站。
例如,start = 1 和 end = 4 之间的最小停靠点数是 3,因为我们可以从 1 到 2 再到 4。
我正在考虑一种动态编程解决方案,它将在dp[start][end] 中存储start 和end 之间的最小步数。我们将使用start...mid1, mid1...mid2, mid2...mid3, ..., midn...end 构建数组。但我无法让它工作。你如何解决这个问题?
说明:
- 火车只能从编号较低的车站前进到编号较高的车站。
- 火车可以在任何停靠站发车。
- 可以按任何顺序搭乘火车。 n = 1 列车可以在登上 n = 3 列车之前或之后登上。
- 可以多次搭乘火车。例如,允许上n=1次列车,下一次上n=2次列车,最后再次上n=1次列车。
【问题讨论】:
-
任何火车都可以在任何车站发车吗?
-
@masoudkeshavarz 火车无法启动任何车站。但是火车可以从任何停靠站开始。
-
在赶上
n=3火车后,你能赶上n=1火车吗?还是赶上n=3火车后才能赶上n=4,5,6,....,n_i火车? -
@spacetyper 你可以按任何顺序赶火车。您可以在搭乘 n = 3 列车之前或之后搭乘 n = 1 列车。
-
正如其他发帖者所指出的,鉴于火车只能向前行驶,贪婪的方法显然是最佳解决方案。如果火车可以前进或后退,您可以在停靠点阵列上进行 DP。
minSteps[end] = 0和minSteps[n] = min {minSteps[n ± 2^m] | m ∊ ℕ } + 1。按照增加所有m的minSteps值的顺序进行,直到m是不超过end - start的2 的最小幂,直到您分配给minSteps[start]。事实上,这种方法表明您可以使用 BFS 遍历。该图看起来像一个 FFT 蝴蝶。
标签: algorithm dynamic-programming