【问题标题】:how to solve algorithm problems in both dfs and dp如何解决 dfs 和 dp 中的算法问题
【发布时间】:2022-01-30 04:20:35
【问题描述】:

许多算法问题都可以通过 DFS 和动态规划来解决。这两种算法之间有直接或间接的联系吗?或者如果我想出了dp的子问题,如何将其转换为dfs中的递归函数?

【问题讨论】:

  • 可能是太笼统了,但是我真的很困惑,为什么很多问题都可以用这两种算法解决?

标签: dynamic-programming microsoft-distributed-file-system


【解决方案1】:

DFS + 记忆 = DP

作为一个定义适用于许多问题。

根据动态规划的定义,它必须有"optimal substructure"。这意味着您可以使用子解决方案来获得通用解决方案。

换句话说,简单地说你将使用 f(n-1) 左右来表达 f(n)。这个递归表达式可以使用深度优先搜索直接编码。

为了利用预先计算的子解决方案或子结构,您可以使用 memoization 缓存子解决方案。 DP就是这样。

P.S.:当然你可以使用迭代循环的方法来填充缓存,而不是 DFS + memoization 的方法。但是要回答你的问题,这只会让它更难理解。

【讨论】:

    【解决方案2】:

    动态编程是提高算法效率的一种方法,将其存储在内存中,或者应该说是记忆化。它可以与任何类型的算法结合使用,特别适用于示例 dfs 中的蛮力类型算法。

    一个简单的例子是斐波那契。我假设您已经知道使用递归 (dfs) 求解斐波那契。

    使用 dp,您将不再需要计算相同的值,因为您将存储该值(通常在数组中)。

    示例伪代码:

    //each arr default value will be 0
    declare fibArr size n
    fibArr[0] = 1
    fibArr[1] = 1
    
    function fib(int number)
    {
         //return the fibonacci number if it has been calculated beforehand
         if(fibArr[number] != 0)
             return fibArr[number]
    
         fibArr[number] = fib(number-1) + fib(number-2)
         return fibArr[number]
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多