在使用Algorithms: Design and Analysis II类时,其中一个问题询问路径图的最大权重独立集问题。下面显示的是问题陈述的(模糊)屏幕截图,相应的讲座视频在YouTube上:
https://www.youtube.com/watch?v=0awkct8SkxA
https://www.youtube.com/watch?v=pLOkbHGRsv0
https://www.youtube.com/watch?v=Im_zjFkZDCY
可以通过动态编程优雅地解决这一问题,只需编写一行代码即可。
a[i] = max(a[i - 1], a[i - 2] + w[i])
问题如下:
以下内容对于我们的动态编程算法是正确的 用于计算路径图的最大权重独立集? (假设没有关系。)
- 只要输入图至少具有两个顶点,该算法就永远不会选择最小权重顶点。
- 算法始终选择最大权重顶点。
- 如果将顶点从两个连续子问题的最优解中排除,则将其从所有子问题的最优解中排除 更大的子问题。
- 如果将顶点从子问题的最优解中排除,则将其排除在所有更大问题的最优解之外 子问题。
结果是,正确答案是#3,这有点直观,因为子问题的最佳解决方案仅取决于前两个子问题的解决方案。但是我不清楚为什么选项1和2不正确。由于该算法着眼于所有顶点,因此似乎这两个选项也应正确。
答案 0 :(得分:1)
the algorithm never selects the minimum-weight vertex.
考虑:** 3-100-4-1-5-100-6 选择最小值1是合理的,因为我们要选择两个100
The algorithm always selects the maximum-weight vertex.
考虑: 5-99-100-99-7
排除最大值以支持99表示合理
对于这两个示例,请尝试查看该算法将执行的操作以及其工作原理。
推理这类问题的一种好方法是尝试(0,0,0,1,1,1,2,2,2,3,3,3,99,99,99,100,100,100)的所有排列并且应该可以为您提供大部分机会。
答案 1 :(得分:1)
此处操作:出于完整性考虑,这是一个完整的答案,灵感来自@ robert-king的答案。
考虑路径10-2-1-4
。该算法选择的顶点为10, 1
,其中选择了1
(最小值)。因此,选项1不正确。
考虑路径1-3-10-9
。该算法选择的顶点为3, 9
,其中未选择最大的10
。因此,选项2不正确。
考虑路径1-9-7-1-5
。该算法选择的顶点为1, 7, 5
。但是,7
未包含在子问题1-9-7
的最佳解决方案中。请注意,7
也未包含在子问题1-9-7-1
的最优解中,因为其先前的顶点“更重”,并且由于所有权重均为正,因此下一个权重与较重的顶点肯定大于7
。因此,选项4不正确。
选项3是正确的。这归因于归纳法,因为对一个子问题的最佳解决方案仅取决于前两个子问题的解决方案。