Я получил этот вопрос интервью и застрял на нем:
Существует бесконечное количество остановок поезда, начиная с номера станции 0.
Есть бесконечное количество поездов. N-й поезд останавливается на всех остановках k * 2 ^ (n-1), где k находится между 0 и бесконечностью.
Когда 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.