Algolume

ДП: Задача с кузнечиком

Условие задачи: Вам дан одномерный массив 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). Полученный путь затем разворачивается для вывода правильной последовательности посещённых клеток.

Визуализация алгоритма (Python3)

Для корректной работы визуализации ограничения на входные данные следующие: 2 ≤ n ≤ 30.

Логическое название Название переменной
dp
parent