Всем привет! Я решил углубленно изучить динамическое программирование и поделиться с вами опытом. Недавно я обнаружил довольно интересный план обучения на LeetCode (https://leetcode.com/studyplan/dynamic-programming/), взял его за основу - и полностью завершил, решив все задачи (50/50).


  1. Собственно, это весьма мощный челлендж - 36 задач Medium-уровня и 10 задач Hard-уровня, что весьма полезно для развития и соответствует реальной пропорции сложности задач на реальных собеседованиях

  2. Очень радует, что задачи сгруппированы по паттернам (10 штук) и отсортированны по сложности внутри каждого паттерна, а также вручную подобранны редакторами LeetCode - это намного приятнее решения рандомных задач из тега DP

  3. Собственно, я потратил 24 дня на решение всех задач. Для меня зона комфорта - это 2 medium-задачи в день, но под конец у меня накопилась компетенция и hard-задачи уже перестали отличаться от medium

  4. Я занимался 2-4 часа в день по утрам в одно и то же время, чтобы выработать привычку

  5. Перед практикой я около месяца читал теорию (50 страниц главы по DP из CLRS), и прорешал большую часть упражнений на построение и анализ ДП-алгоритмов на бумаге

  6. У меня накопилась довольно большая математическая подготовка за 5 лет - нужно снимать сливки. В 2020-2022 я неплохо подтянул дискретную математику и Calculus, а в 2023-2025 вложился в фундамент математики и решил более 60% проблем\пробелов в понимании, которые у меня были, включая самые глубокие проблемы в теории типов, логике и теории множеств.

  7. Понимание моделей вычисления - очень помогает. В 2025 я написал на Java 3 модели - Машина Тюрига, лямба-исчисление и RAM-модель. Еще я порабоал с JVM-моделью вычисления поближе (Jasmin) - тоже очень откликается

  8. Собственно, именно RAM-модель используется как теорическая база для LeetCode. Ее инструкции являются чем-то вроде математического ассемблера и я держу ее в голове и иногда программирую на ней напрямую

  9. Глубокое погружение в контекст - это очень круто. Я сейчас не работаю и могу на 100% посвятить себя алгоритмам и думаю о них круглые сутки. Кроме решения задач в LeetCode, у меня много всяких сторонних активностей, релеватных к алгоритмам - задаю много вопросов ChatGPT или Google по мере их возникновения, читаю статьи, сижу на r/LeetCode, и так далее

  10. LeetCode Premium того стоит - покупайте его, не задумываясь

  11. Если бы я сейчас работал, то (скорее всего) не получилось бы так глубоко погрузиться в ДП и войти во флоу с решением задач высокой сложности

  12. Если я пойду собеседоваться, то я оцениваю свою вероятность успеха в задачах ДП как 0.8, а если интервьювер будет помогать и подсказывать - то 0.95. И это в случае классического собеседования (LeetCode или блокнот). А если будет гибридный собес с AI, то вероятность успеха будет еще выше

  13. Я довольно активно использую разговорные возможности ChatGPT Plus (advanced voice mode) и созваниваюсь 1 час в день, чтобы поболтать с моделью 4o и обсудить разные темы и вопросы. Это дает полное погружение в обучении и замыкает круг

  14. Я не дебажу. Совсем. Только анализ алгоритмов в уме, и отправка задачи на проверку при уверенности в корректности. Благодаря такому подходу, экономится много времени и сил. А еще у меня было 5-medium задач и 1 HARD-задача, которые были ACCEPTED с первой попытки (!!!). Если алгоритм корректен, не важно, какие там тест-кейсы и сколько их - задача пройдет

  15. Я редко заглядываю в Solutions - только в 20% от задач. В идеале, можно полностью работать на математической интуиции и импровизировать/синтезировать свой алгоритм. Это намного интереснее и приятнее, чем каждый паттерн задачи разбирать по Solutions и "натаскиваться" на типовые задачи

  16. Еще я заметил, что формальная логика (классическая) - очень помогает с HARD-задачами, декомпозировать их и сделать простыми, закон исключённого третьего прямо на регулярной основе применяю

  17. DP остается релевантным и полезным, так как эффективно решает задачи оптимизации, которые часто встречаются в бизнесе

Итог - глубокое погружение в алгоритмическую парадигму помогает отличить ее от других парадигм и четко видеть плюсы\минусы\границы применения, ревьювить и направлять AI при написании сложных алгоритмов.

Если вам понравилась статья вы хотите меня поддержать - напишите как можно больше полезной обратной связи (в комментариях или на почту kciray8@gmail.com).

Будет классно, если вы поделитесь своим опытом, секретами повышения Leetcode-производительности, а также особыми методиками обучения (если они у вас есть).