Условие задачи: Вам дан одномерный массив route
длиной n
, где каждая ячейка содержит число – стоимость прохождения через неё. Кузнечик начинает движение непосредственно перед первой клеткой и может прыгать на одну или две клетки вперёд. Необходимо пройти весь путь, прибыв в последнюю клетку, с минимальной суммарной стоимостью, а также вывести номера клеток, которые кузнечик посетит.
Формат входных данных: В первой строке задано число n
(2 ≤ n ≤ 1,000,000
). Во второй строке содержится n
целых чисел, где 0 ≤ route[i] ≤ 100
.
Формат выходных данных: В первой строке выведите минимальную суммарную стоимость прохождения. Во второй строке через пробел — номера клеток (целые числа от 1 до n), которые кузнечик посетит при оптимальном перемещении (например: 1 3 4 6
).
Решение:
Для решения задачи применяется метод динамического программирования. Создаётся одномерный массив dp
, где dp[i]
обозначает минимальную стоимость пути до клетки i
. Одновременно формируется массив parent
для восстановления маршрута, где parent[i]
хранит индекс предыдущей клетки, через которую проходил оптимальный путь.
Начальные условия:
dp[0] = route[0]
dp[1] = route[1]
Для остальных клеток выбираем оптимальный переход – из клетки i - 1
или i - 2
, одновременно обновляя индекс предка:
После заполнения массива dp
значение dp[n-1]
является минимальной суммарной стоимостью, а массив parent
позволяет восстановить оптимальный маршрут.
Например, если дан следующий массив:
то после вычислений получится:
Восстановление пути:
Начиная с клетки с индексом n - 1
, последовательно следуйте по массиву parent
, пока не достигнете начальной позиции (индекс 0 или 1). Полученный путь затем разворачивается для вывода правильной последовательности посещённых клеток.