Я преобразую свой комментарий в ответ, так как это будет слишком долго для комментария.
Всегда есть два способа решения задачи динамического программирования: нисходящий с запоминанием или восходящий путем систематического заполнения выходного массива. Моя интуиция говорит, что реализация восходящего подхода будет проще. И я намерен дать ответ, чтобы привести пример такого подхода. Я оставлю читателю в качестве упражнения написать формальный алгоритм, а затем реализовать алгоритм.
Итак, в качестве примера предположим, что первые 11 элементов входного массива:
index: 0 1 2 3 4 5 6 7 8 9 10 ...
spot: W B W B W W W B B W B ...
Чтобы решить проблему, мы создаем выходной массив (он же таблица DP), чтобы хранить информацию, которую мы знаем о проблеме. Первоначально все значения в выходном массиве установлены в бесконечность, за исключением первого элемента, который установлен в 0. Таким образом, выходной массив выглядит следующим образом:
index: 0 1 2 3 4 5 6 7 8 9 10 ...
spot: W B W B W W W B B W B
output: 0 - x - x x x - - x -
, где -
- это черный пробел (не допускается), а x
используется в качестве символа бесконечности (место, которое либо недостижимо, либо еще не достигнуто).
Затем мы выполняем итерацию с начала таблицы, обновляя записи по мере продвижения.
Из индекса 0 мы можем достичь 2 и 5 одним ходом. Мы не можем перейти к 3, потому что это место черное. Таким образом, обновленный выходной массив выглядит так:
index: 0 1 2 3 4 5 6 7 8 9 10 ...
spot: W B W B W W W B B W B
output: 0 - 1 - x 1 x - - x -
Далее мы пропускаем индекс 1, потому что пятно черное. Итак, мы переходим к индексу 2. Из 2 мы можем достичь 4,5 и 7. Индекс 4 еще не достигнут, но теперь его можно достичь за два хода. Прыжок с 2 до 5 достигнет 5 за два хода. Но 5 уже может быть достигнуто за один ход, поэтому мы не будем его менять (именно здесь возникает рекуррентное соотношение). Мы не можем перейти к 7, потому что это черный. Поэтому после обработки индекса 2 выходной массив выглядит так:
index: 0 1 2 3 4 5 6 7 8 9 10 ...
spot: W B W B W W W B B W B
output: 0 - 1 - 2 1 x - - x -
После пропуска индекса 3 (черный) и индекса обработки 4 (может достигать 6 и 9), мы имеем:
index: 0 1 2 3 4 5 6 7 8 9 10 ...
spot: W B W B W W W B B W B
output: 0 - 1 - 2 1 3 - - 3 -
Обработка индекса 5 не изменит ничего, потому что 7,8,10 все черные. Индекс 6 ничего не меняет, потому что 8 черный, 9 уже может быть достигнут за три хода, и мы не показываем индекс 11. Индексы 7 и 8 пропускаются, потому что они черные. И все переходы из 9 в части массива, которые не показаны.
Так что, если целью было достичь индекса 11, число ходов было бы 4, а возможные пути были бы 2,4,6,11 или 2,4,9,11. Или, если массив продолжится, мы просто продолжим итерацию по массиву, а затем проверим последние пять элементов массива, чтобы увидеть, у кого наименьшее количество ходов.