Меня попросили использовать динамическое программирование для решения проблемы. У меня есть смешанные заметки о том, что представляет собой динамическое программирование. Я считаю, что для этого требуется подход «снизу вверх», где сначала решаются самые маленькие проблемы.Может ли рекурсия быть динамическим программированием?
Одна вещь, которая противоречит информации о том, может ли быть что-то динамическое программирование, если одни и те же подзадачи решаются более одного раза, как это часто бывает в рекурсии.
Например. Для Фибоначчи, я могу иметь рекурсивный алгоритм:
RecursiveFibonacci(n)
if (n=1 or n=2)
return 1
else
return RecursiveFibonacci(n-1) + RecursiveFibonacci(n-2)
В этой ситуации, одни и те же подзадачи могут быть решены над- и-снова. Это делает это не динамическое программирование? То есть, если бы я хотел динамического программирования, я бы должен был избежать разрешения подзадач, например, используя массив длины n и хранить решение для каждой подзадачи (первые индексы массива: 1, 1, 2, 3, 5, 8, 13, 21)?
Fibonacci(n)
F1 = 1
F2 = 1
for i=3 to n
Fi=Fi-1 + Fi-2
return Fn
Thanks Gene. Итак, чтобы уточнить определение (это то, что я действительно после: o)), даже если используется рекурсивный алгоритм, и он * неэффективен тем, что одни и те же проблемы могут быть решены снова и снова, все еще считаются динамическим программированием, просто потому, что большие проблемы сначала разбиваются на более мелкие проблемы? – luckButtered
@ user2808302 Нет. Не так, как я когда-либо видел этот термин. Предположение, лежащее в основе динамической программы или алгоритма DP, заключается в том, что субадресы решаются ровно один раз, чтобы получить более крупное решение проблемы. Когда это описывается с помощью рекурсивной формулы, подразумевается мемонирование или построение таблицы снизу вверх. – Gene