Разбор задачи: Минимальная стоимость подъема по лестнице

Предложенный нами код решения:

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]

Логика работы функции:

  1. Обработка базового случая:
    • Если в списке cost всего две ступени, минимальная стоимость равна стоимости самой дешевой из них. Это вычисляется с помощью функции min.
  2. Инициализация массива dp:
    • Создается массив dp, который хранит минимальную стоимость достижения каждой ступени.
    • Размер массива dp равен n + 1, так как кроме ступеней нужно учитывать вершину лестницы.
  3. Установка начальных условий:
    • Минимальная стоимость начала подъема равна нулю для первой и второй ступеней, так как вы можете стартовать бесплатно.
  4. Рекуррентное соотношение:

    • Для каждой ступени, начиная с третьей (индекс 2), минимальная стоимость рассчитывается как минимум из двух значений:
      • Стоимости достижения предыдущей ступени плюс стоимость самой ступени.
      • Стоимости достижения предпредыдущей ступени плюс стоимость предпредыдущей ступени.

    Формула:
    dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]).

  5. Возврат результата:
    • Минимальная стоимость для достижения вершины лестницы хранится в dp[n], где n — длина списка cost.

Пример выполнения:

Входные данные: cost = [10, 15, 20]

  1. Инициализация:
    • n = 3, dp = [0, 0, 0, 0].
  2. Итерации:
    • Для индекса 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.
  3. Возврат: dp[3] = 15.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии