【问题标题】:The overlapping sub problems in bitmask dynamic programming位掩码动态规划中的重叠子问题
【发布时间】:2016-03-23 13:55:39
【问题描述】:

我正在尝试使用动态编程学习位掩码,但我无法理解案例的重叠子问题。有人可以根据他们认为适合轻松解释的任何示例来解释子问题如何重叠吗?

【问题讨论】:

    标签: algorithm dynamic-programming bitmask


    【解决方案1】:

    让我们以Shortest Hamiltonian walk 为例,在这个问题中,我们需要找到一条最短的哈密顿游走,其中每条边都有一定的权重。

    Hamiltonian walk 是我们在图表exactly once 中访问each and every node 的地方。

    对于少量节点,可以使用DP Bitmasks 解决此问题。所以我们要做的是保留一个Bitmask来跟踪我们在当前状态下访问过哪些节点,然后我们可以使用mask遍历所有未访问过的节点我们可以进入不同的状态。

    现在假设一个子问题让我们说k没有节点被计算,这个k节点的解决方案由较小的子问题组成,形成k个节点的更大解决方案,即初始解决方案只有2个节点,然后是3当我们到达kth 节点时,以此类推。

    现在让我们来看另一个子问题,假设m 节点也存在。

    现在从第一个子问题中的一个节点到第二个子问题中的一个节点有一条边,我们想加入这两个子问题,所以在这种情况下,k 节点的所有较小子问题也是整个组合解决方案因此在这里被称为重叠,因为它存在于第一个子问题和更大的组合子问题中。

    为了避免对这些重叠子问题进行冗余计算,我们使用memoisation 的概念,即一旦我们得到重叠子问题的答案,我们就将其存储起来以备后用。

    另外请注意,在上述 2 个子问题中,两个较小的子问题中都不应出现顶点,我们可以使用相应的位掩码进行检查。

    【讨论】:

      【解决方案2】:

      我不完全确定这是否是您要问的。但遗憾的是,一个不属于位掩码问题的示例将是事实上的 DP 初学者示例:斐波那契数列。

      你可能知道,斐波那契数列大致定义如下。

      F(n) = F(n-1) + F(n-2)
      F(0) = F(1) = 1
      

      现在,假设你想找到 F(8)。那么你实际上是在寻找 F(7) + F(6)。要找到 F(7),您需要 F(6) 和 F(5)。而要找到 F(6),则需要 F(5) 和 F(4)。

      如您所见,F(6) 和 F(7) 都需要求解 F(5),这意味着它们是重叠的。顺便说一句,F(7) 也需要解决整个问题 F(6),但对于每个 DP 问题并不总是如此。本质上,有时您的子问题 A 和 B 可能都依赖于较低级别的子问题 C,在这种情况下,它们被视为重叠

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-24
        • 2018-06-11
        • 2019-03-16
        • 2021-02-06
        • 2011-10-17
        • 2012-04-09
        相关资源
        最近更新 更多