Запрограммировать задачу, которую решил через рисунок

Рейтинг: 1Ответов: 1Опубликовано: 03.03.2023

Задача

Компьютерная игра

Во многих старых играх с двумерной графикой можно столкнуться с подобной ситуацией. Какой-нибудь герой прыгает по платформам (или островкам), которые висят в воздухе. Он должен перебраться от одного края экрана до другого. При этом при прыжке с одной платформы на соседнюю, у героя уходит |y2-y1| единиц энергии, где y1 и y2 – высоты, на которых расположены эти платформы. Кроме того, у героя есть супер прием, который позволяет перескочить через платформу, но на это затрачивается 3 * |y3-y1| единиц энергии. Конечно же, энергию следует расходовать максимально экономно.

Предположим, что вам известны координаты всех платформ в порядке от левого края до правого. Сможете ли вы найти, какое минимальное количество энергии потребуется герою, чтобы добраться с первой платформы до последней?

Входные данные

В первой строке входного файла INPUT.TXT записано количество платформ n (1 ≤ n ≤ 30000). Вторая строка содержит n натуральных чисел, не превосходящих 30000 – высоты, на которых располагаются платформы.

Выходные данные

В выходной файл OUTPUT.TXT запишите единственное число – минимальное количество энергии, которую должен потратить игрок на преодоление платформ (конечно же в предположении, что cheat-коды использовать нельзя).

Моё визуальное решение:

Допустим на вход поступило число 4 и цифры 1 10 14 3. Тогда мы можем визуализировать это в виде рисунка:

Рисунок

Над стрелочками написано количество затраченной энергии, чтобы добраться до этой платформы

Проблема:

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

Ответы

▲ 2Принят

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

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

На первой платформе мы стоим изначельно, энергия для ее достижения не требуется

1 10 14 3
0

До второй платформы можем добраться единственным способом – с первой платформы. Тратим 9 энергии на прыжок, плюс к тому значению, что требовалось для достижения первой платформы (т.е. 0)

1 10 14 3
0 9

До третьей можно добраться двумя способами. С первой (0 + |14 - 1| * 3) или со второй – (9 + |14 - 10|). Второй вариант дешевле

1 10 14 3
0 9 13

Так же и для 4 и всех последующих шагов, зная самые дешевые решения для предыдущих, проверяем что дешевле – прыгнуть или перепрыгнуть.

1 10 14 3
0 9 13 24

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