Выбор подзадач для динамического программирования


39

Я несколько раз использовал технику динамического программирования, однако сегодня мой друг спросил меня, как мне определить свои подзадачи, и понял, что у меня нет возможности дать объективный формальный ответ. Как вы формально определяете подзадачу для задачи, которую вы бы решили использовать с помощью динамического программирования?


Похоже, что ни один из существующих ответов (по состоянию на апрель 2019 года) не является достаточно хорошим, особенно для начинающих. Я бы порекомендовал учебники на других сайтах.
Apass.Jack

Ответы:


35

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


14
Я утверждаю, что это единственная стратегия.
Джефф

2
@JeffE Да, я читал и использовал твои заметки при обучении на уроках алгоритмов, и это было эффективно. Цитата: «Dynamic - это не заполнение таблиц. Это умная рекурсия!»
Дай

2
На моё понимание того, как преподавать ДП, сильно влияют заметки @ JeffE :)
Suresh

3
Также возможно автоматически превратить рекурсивную процедуру сверху вниз в алгоритм динамического программирования. Когда вы собираетесь вернуться, сохраните ответ в хеш-таблице. В начале каждого вызова проверяйте, есть ли ответ в хеш-таблице, и если да, немедленно возвращайте его. Многие алгоритмы становятся проще с этой идеей. Например, с такой таблицей рекурсивные алгоритмы при попытках автоматически работают с DAWG. Сохраняя значение стража в таблице в начале вызова, одни и те же алгоритмы могут работать даже на DFA. Алгоритмы на BDD становятся очень простыми для рекурсивного определения.
Жюль

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

4

Как отметил @Suresh, как только вы узнаете, что ваша проблема может быть решена с помощью DP (т.е. она имеет оптимальную подструктуру и перекрывающиеся подзадачи), вы можете подумать о рекурсивном решении «разделяй и властвуй».

O(1)

Поэтому размышление о решении «разделяй и властвуй» даст вам представление о том, какой может быть подзадача для вашей конкретной проблемы.


1
«оптимальная субструктура» (что бы это ни значило), вероятно, не является достаточным условием для DP-разрешимости. «Перекрывающиеся подзадачи», безусловно, не являются необходимыми.
Рафаэль

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

1
Это не моя формулировка: вы найдете ее в «Введение в алгоритмы» Кормена, Лизерсона, Ривеста и Стейна и во многих других учебниках по алгоритмам.
Массимо Кафаро

1
Jup, и большинство, по крайней мере, частично неправильно. Я с удовольствием уточню, если вы отправите подходящий вопрос.
Рафаэль

1
Я не уверен, что правильно понял ваш последний комментарий. Чтобы показать, что этот вид характеристики является неправильным (он не может быть частично неправильным: либо является правильным, либо неправильным), вы можете просто показать в качестве контрпримера проблему, которая не имеет оптимальной подструктуры и перекрывающихся подзадач, но поддается полиномиальному решению DP. Но обратите внимание, что в этом контексте это означает решение, которое доказуемо лучше, чем обычные «разделяй и властвуй».
Массимо Кафаро

2

Мой опыт заключается в том, чтобы найти способ «сократить избыточное перечисление с помощью хранения уже перечисленного полезного значения». Кстати, динамическое программирование действительно популярно в ICPC (International Collegiate Programming Contest). Любой может испытать свои чувства к DP после того, как попрактиковался в нескольких проблемах ICPC.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.