【发布时间】:2018-09-26 18:30:48
【问题描述】:
我需要为以下问题找到一种“动态编程”的解决方案:
输入:
-
完美二叉树,T = (V,E) - (每个节点除了叶子节点外正好有 2 个子节点)。
V = V(blue ) ∪ V(黑色)。 V(蓝色) ∩ V(黑色) = ∅.
(换句话说,树中的一些顶点是蓝色的)
- 树的根'r'。
- 整数 k
合法的解决方案:
顶点 V' ⊆ V 的子集,它是 T 的 顶点覆盖,并且 |V' ∩ V(blue)| = k。 (也就是说,覆盖V'包含k个蓝色顶点)
解决方案价值:
合法解 V' 的值是集合中的顶点数 = |V'|。 为方便起见,我们将“非法”解的值定义为∞。
我们需要找到什么:
具有最小价值的解决方案。
(换句话说,最好的解决方案是一个覆盖,恰好包含k个蓝色顶点和顶点数在集合中是minimal。)
我需要定义一个典型的子问题。 (例如,如果我知道子树的价值解决方案是什么,我可以使用它来找到问题的价值解决方案。)
并提出一个公式来解决它。
【问题讨论】:
-
这看起来像家庭作业。如果您有一个函数可以计算出包含根的树的最佳解决方案,以及另一个不包含根的最佳解决方案。然后您可以将其应用于左右树。如果两个最佳解决方案都包括左右树的根,那么你就完成了,否则你需要包括根以确保根被覆盖。然后,您可以递归地使用它。如果你memoize / DP,那么应该是O(N)
标签: algorithm graph tree minimum cover