Найти тему

Задача 29. Компьютерная игра

Хорошая задача на динамическое программирование, без каких-либо подводных камней. Читаем условие:

Условие задачи с сайта acmp.ru
Условие задачи с сайта acmp.ru

Как часто бывает в задачах на динамическое программирование, основная сложность заключается в придумывании рекуррентного соотношения и понимании принципа работы, а не в написании кода (потому что обычно в них один или два цикла, просто заполняющие массив). Поэтому давайте сконцентрируемся на методе решения.

Для начала надо определить, что будет состоянием в динамике. В данной задаче с этим нет проблем - это номер платформы, на которой стоит герой. Для каждого возможного состояния мы будем считать минимальную количество энергии, которое надо потратить, чтобы в нём оказаться.

Чтобы посчитать ответ для состояния i, надо рассмотреть все переходы, откуда мы могли в него придти:

  • из состояния i - 1, тогда затраченная энергия будет равна ответу для состояния i - 1 плюс модуль разности высот между платформами i и i - 1,
  • из состояния i - 2, в этом случае затраченная энергия будет равна ответу для состояния i - 2 плюс утроенный модуль разности высот между платформами i и i - 2.

И среди всех этих возможностей надо выбрать оптимальный переход, то есть с минимальными затратами энергии.

Давайте реализуем это решение. Сначала считаем входные данные:

Считываем входные данные и приводим их к числовому типу
Считываем входные данные и приводим их к числовому типу

Заметим, что количество платформ однозначно можно получить из длины списка, поэтому это значение можно не хранить. Заведём массив, где для каждого состояния будем хранить ответ (минимальное количество энергии, необходимое, чтобы попасть в него). А также отдельно обработаем случай второй платформы (так как в это состояние существует только один переход, а не два, как во все остальных):

Обработка второй платформы
Обработка второй платформы

Теперь пройдёмся в цикле по всем остальным состояниям (платформам) и посчитаем ответы как минимум из двух возможных переходов. По сути, здесь лишь запись того, что мы описали текстом:

Подсчёт динамики
Подсчёт динамики

Осталось вывести ответ. В нашем случае он будет храниться в последнем элементе массива res, так как он соответствует последнему состоянию динамики, то есть нахождению на последней платформе:

Вывод ответа
Вывод ответа

Предыдущий выпуск: Задача 27. Художник

Я очень хочу, чтобы мои советы были полезны вам, а для того, чтобы быстрее всех получать новые статьи можно подписаться на мой канал.

Наука
7 млн интересуются