Динамическое программирование: запоминаем уже решенные подзадачи

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

Краткий ответ

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

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

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

Пример с лестницей

Школьник может подниматься на 1 или 2 ступеньки. Сколько способов подняться на n ступенек?

Для первой ступеньки есть 1 способ. Для второй — 2 способа. Для каждой следующей ступеньки ответ равен сумме двух предыдущих: попасть на нее можно с предыдущей ступеньки или через одну.

n = int(input())
dp = [0] * (n + 1)
dp[0] = 1

for step in range(1, n + 1):
    dp[step] += dp[step - 1]

    if step >= 2:
        dp[step] += dp[step - 2]

print(dp[n])

Как узнать динамику

В задаче есть признаки динамического программирования:

Что хранить в массиве dp

Самый важный вопрос: что означает dp[i]? Например, “количество способов добраться до i-й ступеньки” или “лучший результат на первых i элементах”. Если смысл ячейки понятен, формула обычно находится легче.

Динамическое программирование не нужно начинать со сложных олимпиадных задач. Достаточно освоить лестницы, маршруты по клеткам, простые суммы и выбор максимального результата. Эти темы развивают алгоритмическое мышление и помогают понять, почему запоминание подзадач ускоряет решение.

Что важно запомнить

https://yadro-code.ru/lessons/without-university/school-programming-basics/school-programming-22