Я несколько раз использовал технику динамического программирования, однако сегодня мой друг спросил меня, как мне определить свои подзадачи, и понял, что у меня нет возможности дать объективный формальный ответ. Как вы формально определяете подзадачу для задачи, которую вы бы решили использовать с помощью динамического программирования?
algorithms
dynamic-programming
Даниэль Гратцер
источник
источник
Ответы:
Принцип динамического программирования - думать сверху вниз (то есть рекурсивно), но решать снизу вверх. Поэтому хорошей стратегией для разработки ДП является рекурсивное формулирование проблемы и генерация подзадач таким образом.
источник
Как отметил @Suresh, как только вы узнаете, что ваша проблема может быть решена с помощью DP (т.е. она имеет оптимальную подструктуру и перекрывающиеся подзадачи), вы можете подумать о рекурсивном решении «разделяй и властвуй».
Поэтому размышление о решении «разделяй и властвуй» даст вам представление о том, какой может быть подзадача для вашей конкретной проблемы.
источник
Мой опыт заключается в том, чтобы найти способ «сократить избыточное перечисление с помощью хранения уже перечисленного полезного значения». Кстати, динамическое программирование действительно популярно в ICPC (International Collegiate Programming Contest). Любой может испытать свои чувства к DP после того, как попрактиковался в нескольких проблемах ICPC.
источник