我正在尝试通过动态编程学习位掩码,但我没有理解案例的重叠子问题。有人可以根据他们认为适合解释的任何例子来解释子问题是如何重叠的吗?
答案 0 :(得分:1)
让我们以Shortest Hamiltonian walk
为例,在这个问题中,我们需要找到哈密顿步行,这是每条边都有一定重量的最短路径。
Hamiltonian walk是我们在图each and every node
中访问exactly once
的地方。
对于少量节点,使用DP Bitmasks
可以解决此问题。所以我们要做的是保持Bitmask
跟踪我们在当前状态中访问过哪些节点,然后我们可以使用mask
迭代所有未访问过的节点我们可以去不同的状态。
现在假设一个子问题可以说k
没有计算节点,这个k
节点的解决方案构成了较小的子问题,形成了k个节点的更大解,即初始解只有2个当我们到达kth
节点时,节点,然后是3,依此类推。
现在让我们再考虑另一个子问题,即假设m
节点也存在。
现在第一个子问题中的节点到第二个子问题中的节点存在边缘,我们想要加入这两个子问题,所以在这种情况下k
个节点的所有较小的子问题也都较小整个组合解的子问题因此在这里被称为重叠,因为它存在于第一个子问题和较大的组合子问题中。
为了避免重复计算这些重叠的子问题,我们使用memoisation
的概念,即一旦我们得到重叠子问题的答案,我们就将其存储起来供以后使用。
另请注意,在上面的2个子问题中,在我们可以使用相应的位掩码检查的较小子问题中都不应存在顶点。
答案 1 :(得分:0)
我不完全确定这是不是你问的问题。但遗憾的是,在比特掩蔽问题领域不存在的一个例子是事实上的初学者对DP:Fibonacci序列的例子。
您可能知道,Fibonacci序列大致定义如下。
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,在这种情况下它们被视为重叠。