Як ви визначаєте проблему як придатну для динамічного програмування?


19

Я читав про динамічне програмування останнім часом. Хотілося б почути від когось, хто почав з нуля і зараз досить добре виявляє та вирішує проблеми з ДП. Я намагаюся визначити ці проблеми як DP та формувати стисле рішення.

Я пережив більшість проблем з початковими розробниками та ресурсами MIT тощо

Відповіді:


17

Я виходжу з фізики, і, таким чином, багато математики. Мені здається, що легко помітити проблеми, які добре підходять для рекурсивних / динамічних рішень програмування, знаходячи схожість із доказами за допомогою індукції .

У доказ індукції ви маєте дві частини:

  • ви доказуєте, що якщо щось істинне для ітерації N, то це також ітерація N + 1
  • ти доводиш, що це правда для ітерації 1

У рекурсивному / динамічному програмуванні:

  • Ви визначаєте умову виходу (наприклад, ви жорстко передаєте рішення для ітерації 1)
  • ви обчислюєте рішення для ітерації N з урахуванням рішення для ітерації N-1

Отже, як відповіли інші, це питання досвіду та підбору натяків, але ви можете повторно використовувати інші навички, щоб направляти вас. Після цього у вас завжди повинні бути дві частини, про які я згадував: якщо ви цього не зробите, то це не спрацює.

Наприклад, для створення всіх перестановок набору:

  • умова виходу: якщо у вас є лише один елемент, поверніть його
  • рекурсія: перестановки набору з N елементів - це N наборів перестановок, які ви отримуєте, обираючи кожен елемент і комбінуючи з усіма N-1 наборами (безлічі) перестановок отриманого підмножини, видаляючи елемент.

8

Більшість проблем з динамічним програмуванням можна вирішити через запам'ятовування. Запам'ятовування, як правило, є більш інтуїтивно зрозумілим та легшим для кодування. Можливо, вам буде корисно думати про запам'ятовування замість DP.

Зазвичай простіше зрозуміти, чи добре підходить проблема до запам'ятовування (кроки такі ж, як відповідь Сливвза , але я думаю, що розумовий зсув трохи коротший). Однак, як тільки ви вирішили проблему за допомогою мемонізації, ви можете вивчити, як заповнюється кеш-пам'ять, а потім заповнити її по порядку, без рекурсії ... що змінює ваш алгоритм на алгоритм динамічного програмування.

TL; DR; версія: Вам може бути простіше зрозуміти динамічне програмування з точки зору запам'ятовування.

Дивіться також StackOverflow: Динамічне програмування та запам'ятовування: підходи знизу вгору та зверху вниз .


4

Динамічне програмування, безумовно, стосується двох речей:

  1. Оптимальна підструктура
    Більші рішення можуть бути отримані з менших рішень; рішення не є двостороннім.

  2. Субпроблеми, що перекриваються
    Невеликі рішення будуть багаторазово використані. Якщо підпрограми взагалі не перетинаються, то ви не отримаєте користі від DP / пам'яті; що у вас є - розділіть і завоюйте натомість.

Загальний підхід до проблем з ДП:

  • Напишіть наївну рекурсивну або ітеративну версію, яка працює.

  • Зауважте, що функція виконує надлишкову роботу.

  • Знайдіть спосіб уникнути зайвої роботи, часто шляхом спогадів.


Все це вірно з теоретичної точки зору. IMO потрібно трохи більше практики, щоб бути більш знайомим при швидкій ідентифікації :)
user110036

2

Я ніколи не реалізовував жодного динамічного рішення програмування - в моєму фоновому режимі застосовуються математика / фізика / числові обчислення, а не CS - до декількох років тому, коли я почав займатися проблемами Project Euler . Проблеми, що вирішуються DP, існують (наприклад, 76 , 158 , 161 , 242), але є ще багато) виявилося дуже моїм улюбленим видом. Ви, безумовно, краще помічаєте, коли це буде корисною технікою: в основному шукайте речі, які здаються такими, що їх можна було б вирішити якимось рекурсивним підходом до ділення та перемоги, де також можна приручити вибух потрібних шляхів. слід досліджувати, розпізнаючи повторювані підпрограми та повторно використовуючи раніше обчислені результати; можливість визначити мінімальний вектор стану, який слід запам'ятати - і що нерелевантну "історію" можна стерти - є вирішальним кроком.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.