Как улучшить своё Динамическое программирование?

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

Ладно, шутки шутками, но Dynamic programming (DP) действительно нужно нам на собеседованиях. По сути, это один из главных типов задач из medium-hard, которые нужно уметь решать на leetcode собеседованиях. Можно относится к этому по всякому, но таковы правила игры, нам просто нужно адоптироваться и побеждать.

Последние несколько недель я пытался улучшить свои навыки DP. Скажу честно — это моя слабая тема. Даже на medium DP задачах я почти всегда встаю в тупик, и без hint со стороны сайта, или подсказки из решений — не могу найти верное решение. Про hard DP задачи я даже не говорю — совсем не выходит их решать. Поэтому я решил, пока есть свободное время, немного порешать задачи из этой сферы, немного набить руку, чтобы улучшить свои решения с типичной экспоненты (любимый Brute-force через рекурсию), на хотя бы полином через рекурсию с мемоизацией.

Далее я хочу опубликовать набор ссылок, книг и курсов, которые на мой взгляд достойны внимания. Я не буду приводить что-то банальное, типа Алгоритмы: построение и анализ (Кормен), потому что эта книжка просто улучшает вашу теоретическую базу, а не готовит к типичным собеседованияем. То есть, да, прочитать ее стоит в свободное время, но это не самый быстрый путь набить руку на DP.

  • https://leetcode.com/discuss/general-discussion/458695/dynamic-programming-patterns — это, наверное, главная ссылка из моей статьи. Тут приведены основные типы задач динамического программирования для собеседований, и их типичные решения.
  • https://leetcode.com/discuss/study-guide/662866/DP-for-Beginners-Problems-or-Patterns-or-Sample-Solutions — еще один хороший набор типовых задач.
  • https://leetcode.com/discuss/study-guide/1000929/solved-all-dynamic-programming-dp-problems-in-7-months — все DP задачи, разбитые по категориям
  • https://www.youtube.com/watch?v=oBt53YbR9Kk — отличное видео — введение в тему динамического программирования. Хоть идет 5 часов, смотретися на одном дыхании. Можно смотреть по главам по примерно 1 часу за раз. Если для вас DP — что-то новое — начинайте с этого видео.
  • Книга Algorithms Illuminated (Part 3): Greedy Algorithms and Dynamic Programming — несколько глав про динамическое программирование в целом. Читается легко, поможет понять эту тему.
  • https://www.educative.io/courses/algorithms-coding-interviews-java — общий курс по подготовке к собесам по алгоритмам. Есть и раздел с DP. Это подойдет для тех, кто хочет платно подготовится к собеседованию, а не конкретно к одной теме с DP. Сам я этот курс не проходил, но ребята советовали.
  • https://leetcode.com/explore/learn/card/dynamic-programming/ — если у вас уже есть платная подписка на LI, можете пройти их курс по DP. По сути, это набор задач по каждому из типовых шаблонов динамического программирования с большим разбором 1-2 задач в каждой теме. Вполне хорошее качество, если у вас уже есть подписка на LI. Если нет, можете просто открыть первые мои ссылки из списка, там будут примерно теже задачи, и объяснения вы сможете найти в публично доступных разборах.

Я не скажу, что стал сильно лучше разбираться в теме DP за последние пару недель. Однако все равно какой-то минимальный прогресс есть. Говорят, что чтобы стать крутым в DP, нужно просто решать решать задачи DP (хо-хо, заметили каламбур?? рекурентное соотношение, хохо).

Категории: Программирование