Программа курса:
Разбор задачи: Минимальная стоимость подъема по лестнице
Предложенный нами код решения:
def min_cost_climbing_stairs(cost: list[int]) -> int:
"""
:param cost: Список целых чисел, представляющий стоимость каждой ступени.
:return: Минимальная стоимость подъема на вершину.
"""
n = len(cost)
if n == 2:
return min(cost) # Для двух ступеней просто минимальная стоимость.
# Динамическое программирование: минимальная стоимость для каждой ступени.
dp = [0] * (n + 1) # dp[i] — минимальная стоимость, чтобы достичь i-й ступени.
dp[0], dp[1] = 0, 0 # Начать можно с первых двух ступеней без стоимости.
for i in range(2, n + 1):
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
return dp[n]Логика работы функции:
- Обработка базового случая:
- Если в списке
costвсего две ступени, минимальная стоимость равна стоимости самой дешевой из них. Это вычисляется с помощью функцииmin.
- Если в списке
- Инициализация массива
dp:- Создается массив
dp, который хранит минимальную стоимость достижения каждой ступени. - Размер массива
dpравенn + 1, так как кроме ступеней нужно учитывать вершину лестницы.
- Создается массив
- Установка начальных условий:
- Минимальная стоимость начала подъема равна нулю для первой и второй ступеней, так как вы можете стартовать бесплатно.
Рекуррентное соотношение:
- Для каждой ступени, начиная с третьей (индекс 2), минимальная стоимость рассчитывается как минимум из двух значений:
- Стоимости достижения предыдущей ступени плюс стоимость самой ступени.
- Стоимости достижения предпредыдущей ступени плюс стоимость предпредыдущей ступени.
Формула:
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]).- Для каждой ступени, начиная с третьей (индекс 2), минимальная стоимость рассчитывается как минимум из двух значений:
- Возврат результата:
- Минимальная стоимость для достижения вершины лестницы хранится в
dp[n], гдеn— длина спискаcost.
- Минимальная стоимость для достижения вершины лестницы хранится в
Пример выполнения:
Входные данные: cost = [10, 15, 20]
- Инициализация:
n = 3,dp = [0, 0, 0, 0].
- Итерации:
- Для индекса 2:
dp[2] = min(dp[1] + cost[1], dp[0] + cost[0]) = min(0 + 15, 0 + 10) = 10. - Для индекса 3:
dp[3] = min(dp[2] + cost[2], dp[1] + cost[1]) = min(10 + 20, 0 + 15) = 15.
- Для индекса 2:
- Возврат:
dp[3] = 15.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии