我知道每个可以用动态规划解决的程序都可以用递归解决,反之亦然吗?如果可能的话,那么时间复杂度将如何变化?
反之亦然吗?
是的。
另一方面,如果你真的想问:
反之亦然吗?
那么合理地说,答案是否定的。并非所有可以用递归算法解决的问题都可以用动态规划合理地解决。我们只需要提出一个问题来强调这一点:排序。用递归算法解决排序问题很容易,但似乎没有一个合理的算法来解决用动态规划解决排序的问题。不幸的是,我不得不在这里使用"合理"这个词,因为你可以以某种方式强制使用动态编程来解决排序问题,以一种非常笨拙和低效的方式。
关于时间复杂度的问题无法回答。这取决于手头的问题,以及动态规划在解决问题方面的适用程度。
如果(1)它具有最优子结构,即它是递归的,并且(2)它具有重叠的子问题,则可以使用动态规划解决问题。因此,任何没有重叠子问题的递归问题都不能使用动态规划来解决。示例:插入排序,如果递归定义为 sorted_list[0:n] = sorted_list[0] + sorted_list[1:n]。
动态规划是时间与复杂性的权衡。您将一些信息存储在表中,因此在需要再次执行相同操作时无需重新计算它们。
如果你的问题自然分解为经常重复的子问题,那么动态规划是个好主意。另一方面,如果没有重复出现的子问题,那么使用动态规划就没有意义。