Динам. программирование: тренируемся к ЕГЭ информатика
9
Что это и для чего нужно для экзамена

** изображение создано или обработано с помощью ИИ.
Динамическое программирование звучит как заклинание старого программиста. На деле это обычный способ не вычислять одно и то же многократно. Я готовлю учеников к экзамену несколько лет и сам когда-то смотрел на таблицу dp как на меню кофейни ранним утром.
Главная идея проста. Разбиваете задачу на небольшие состояния. Вычисляете ответ для каждого состояния ровно один раз. Затем используете уже готовые значения для следующих шагов. Без магии — только аккуратность и немного терпения.
На ЕГЭ динамика помогает в задачах:
- на подсчёт количества программ (сколько способов достичь цели);
- на рекурсию с повторяющимися вызовами;
- на игровые стратегии (выигрышные/проигрышные позиции);
- на обработку больших данных, где полный перебор работает слишком долго.
Как узнать динамику? В условии часто есть фраза «количество способов» или «найти оптимальный результат» при пошаговом изменении состояния (числа, позиции, суммы). Если полный перебор даёт миллионы вариантов — почти наверняка нужна динамика.
Мини-алгоритм решения:
- Определить, что является состоянием (например, текущее число S или позиция в массиве).
- Найти начальное состояние (старт) и целевое (финиш).
- Задать правило перехода: как из одного состояния попасть в другое.
- Заполнять таблицу в порядке от простых состояний к сложным.
- Ответ взять в целевой ячейке.
Хотите уверенно решать задание 17 и не бояться рекурсии в задании 16? Запишитесь на курсы подготовки к ЕГЭ по разбору задач на эффективные алгоритмы. Проверим, как вы находите оптимальные пары и тройки; покажем, где применять мемоизацию, а где достаточно одного цикла; составим план подготовки без «зависаний» на сложных темах.
Как узнать задачу на динамику

** изображение создано или обработано с помощью ИИ.
Первый признак — повторяющиеся подзадачи. Программа может прийти к числу 20 разными путями. Если каждый путь заново вычисляет одну и ту же часть, время уходит впустую. Динамика запоминает результат после первого расчёта и использует его дальше.
Второй признак — состояние описывается коротко. Это может быть одно число (текущая позиция, сумма, остаток) или пара параметров (индекс плюс ещё одна характеристика). Чем точнее и компактнее состояние, тем проще решение.
Третий признак — ответ собирается из соседних или предыдущих ответов. Для числа n нужен результат для n−1 или n/2. Для клетки в таблице — ответ сверху или слева. Для игровой позиции — результаты следующих ходов.
Разница между динамикой и полным перебором. Перебор пробует все варианты каждый раз заново. Динамика один раз вычисляет промежуточные итоги и сохраняет их. Поэтому динамика почти всегда быстрее и удобнее для отладки.
Яркий маркер в ЕГЭ — фраза «количество способов». Она практически мигает неоном. Увидели такую задачу — проверяйте, можно ли описать состояние и переходить между ними. Обычно ответ для текущего состояния равен сумме способов прийти из предыдущих.
Пример из практики.
Ученик: «А если просто рекурсией?»
Я: «Можно. Но добавьте запоминание результатов (кэш), иначе ноутбук начнёт работать очень долго».
Мини-инструкция: строим решение по шагам

** изображение создано или обработано с помощью ИИ.
Я даю ученикам короткий ритуал без свечей и бубна. Только ручка, бумага и голова. Порядок действий:
- Определить, что будет состоянием.
- Записать стартовые значения.
- Найти переходы между состояниями.
- Выбрать порядок вычисления.
- Проверить ответ на маленьком примере.
- Только потом писать код.
Что такое состояние? Это вопрос, на который отвечает ячейка таблицы. Например: «сколько способов получить число x». Или: «выигрышна ли позиция с кучей s». Если вопрос сформулирован нечётко, решение тоже поплывёт.
Стартовые значения. Их нельзя подбирать на глаз. Они задают всю конструкцию. В задаче на количество способов добраться до цели старт обычно равен 1 — мы находимся в начальной точке одним способом.
Переходы. Берутся из условий задачи. Если разрешены команды +1 и ×2, то в x можно прийти из x−1 и из x/2 (второй переход только для чётного x). Такие мелочи часто портят ответы.
Порядок вычисления. Если новое значение зависит от меньших чисел, идём слева направо. В игровых задачах удобнее идти от конечных позиций назад. В задачах на строки иногда требуется таблица по двум индексам.
Главное правило. Не начинайте с кода. Сначала нарисуйте два-три состояния вручную. Код только повторяет мысль. Если мысли нет, компьютер не станет телепатом.
Разбор на маленьком примере

** изображение создано или обработано с помощью ИИ.
Рассмотрим учебный пример: нужно узнать количество способов получить число 10 из 1. Разрешены команды «+1» и «*2». Числа здесь маленькие, важен принцип.
Обозначим dp[x] — количество способов получить число x из 1. Стартовое значение: dp[1] = 1. Мы уже находимся в начальной точке, ни одной команды ещё не сделано.
Переходы. В число x можно прийти: из x−1 командой «+1»; если x чётное, то из x/2 командой «*2».
Формула: dp[x] = dp[x-1] + (dp[x//2] если x чётное, иначе 0). Проверка руками:
- dp[2] = dp[1] + dp[1] = 1 + 1 = 2 (пути: +1 и *2);
- dp[3] = dp[2] = 2 (только из 2 командой +1);
- dp[4] = dp[3] + dp[2] = 2 + 2 = 4.
Таблица растёт спокойно. Мы не строим деревья всех команд — просто складываем уже найденные ответы. В этом преимущество динамики: она превращает разветвлённый куст в аккуратную линейную последовательность.
В Python это часто реализуется циклом по x от 2 до целевого числа. Но не спешите переносить формулу вслепую. Важные детали для экзамена:
- Если есть запрет на прохождение через какое-то число, dp[запрет] нужно обнулить.
- Если нужно обязательно пройти через определённую точку, задачу разбивают на две части: от старта до точки и от точки до цели, затем перемножают результаты.
Один пропущенный запрет, и ответ становится неверным. Обидно, особенно когда общая логика была почти правильной.
Типичные ошибки и правила выживания

** изображение создано или обработано с помощью ИИ.
Первая ошибка — неправильно выбранное состояние. Ученик хранит только одно число, хотя нужно учитывать ещё количество ходов или текущий остаток. Таблица есть, а смысла в ней нет.
Вторая ошибка — неверная база. Поставили dp[0] = 1 без причины. Или забыли dp[start] = 1. Дальше программа честно считает, но считает мусор. Компьютер не спорит, он исполнительный.
Третья ошибка — плохой порядок вычислений. Значение зависит от будущего, которого ещё нет. В рекурсии это лечится запоминанием результатов (мемоизация). В цикле нужно перестроить направление обхода — идти от базы к цели.
Четвёртая ошибка — смешивание «можно» и «нужно». В игровых задачах это особенно больно. Победная позиция существует, если есть хотя бы один ход в проигрышную. Проигрышная — если все ходы ведут в победные. Каждое слово в определении важно.
Правила, которые работают:
- Пишите смысл dp рядом с формулой (комментарий или запись на полях).
- Проверяйте первые 2–3 значения вручную, без кода.
- Не игнорируйте запреты из условия.
- Сначала решайте задачу на маленьких числах (до 10).
- Если нужно обязательно пройти через точку, разделяйте задачу на две части.
- Для рекурсивной динамики добавляйте кэш результатов (например, @lru_cache).
После написания кода проверьте граничные случаи: ноль, единица, максимальное значение.
Совет из практики. Называйте переменные понятно.
Не превращайте решение в суп из a, b, c, tmp1, tmp2. На экзамене это экономит нервы. А нервы там дороже шоколадки из автомата.
Если ответ не сходится — не переписывайте всё сразу. Распечатайте (или запишите) таблицу для первых 5-10 значений. Ошибка почти всегда сидит в одной формуле. Найдёте её быстрее, чем заварится чай.
Частые вопросы перед тренировкой

** изображение создано или обработано с помощью ИИ.
Нужно ли учить динамическое программирование отдельно? Да, но без фанатизма. Для ЕГЭ важнее научиться узнавать шаблоны. Сначала разберите задачи на количество способов. Затем переходите к играм и рекурсии с запоминанием результатов.
Можно ли решать динамику только рекурсией? Иногда можно. Но рекурсия без запоминания (кэша) часто работает медленно. Добавляйте кэш через словарь или встроенные инструменты Python. При этом важно понимать, какие именно данные вы сохраняете.
Что лучше: таблица (цикл) или рекурсия с кэшем? Зависит от задачи. Таблица понятнее, когда состояния перебираются последовательно (слева направо). Рекурсия удобнее, когда переходы сильно ветвятся и не очевиден порядок вычисления. На экзамене выбирайте тот способ, который вы быстрее отладите.
Как тренироваться, если тема не идёт? Берите одну модель задачи в день. Решите три похожих примера. Затем измените условие: добавьте запрет, обязательную точку, новую команду. Так мозг начинает видеть конструкцию, а не пугаться каждого нового текста.
Сколько кода нужно писать? Ровно столько, чтобы получить ответ надёжно. Иногда хватает десяти строк. Но перед кодом должна быть понятая формула или таблица. Без неё код станет гаданием на клавиатуре.
Не пытайтесь понять всю динамику за один вечер. Это тренажёр для логики. Маленькие регулярные подходы дают лучший результат. Сегодня таблица на числах, завтра игра, послезавтра задача с файлом. И вот уже страшное слово dp выглядит почти как домашний кот.
Хочешь начать готовиться, но остались вопросы?
Заполни форму, и мы подробно объясним, как устроена подготовка к ЕГЭ и ОГЭ в ЕГЭLAND