Algorithm 标记顶点以创建最小成本
我有一个问题: 给您一个根树T,表示公司的层次结构,和 您希望用整数1、2或3标记T中的每个节点,以便每个节点都有一个 与其父项不同的标签。标记的成本是已标记的节点数 比他们的父母小的标签。描述并分析一种算法来计算 给定树T的任何标记的最小成本Algorithm 标记顶点以创建最小成本,algorithm,dynamic,Algorithm,Dynamic,我有一个问题: 给您一个根树T,表示公司的层次结构,和 您希望用整数1、2或3标记T中的每个节点,以便每个节点都有一个 与其父项不同的标签。标记的成本是已标记的节点数 比他们的父母小的标签。描述并分析一种算法来计算 给定树T的任何标记的最小成本 如何使用动态规划解决此问题?对于每个节点I,假设当前节点I具有标签1、2或3,则需要计算其子树的最小标签成本。 了解当前节点的每个子节点的这些值,可以计算当前节点的这些值 您可以使用深度优先搜索一种算法来实现它。Sergey的想法是正确的,但由于这是一个
如何使用动态规划解决此问题?对于每个节点
I
,假设当前节点I
具有标签1
、2
或3
,则需要计算其子树的最小标签成本。
了解当前节点的每个子节点的这些值,可以计算当前节点的这些值
您可以使用
深度优先搜索一种算法来实现它。Sergey的想法是正确的,但由于这是一个通用树,因此在组合步骤中有一些微妙之处,应该可以避免指数膨胀
让我们使用以下数据结构表示树
data Tree = Node | Edge Tree Tree
在英语中,树可以是单个节点,也可以是一个子树,其根是整个根和树的其余部分的子节点。例如,树
*
/|\
* * *
|
*
表示为边节点(边(边节点)(边节点))
现在,让我们定义一个递归过程dp'
,它接受一棵树并在三种情况下返回着色的代价:root为1,root为2,root为3
dp' :: Tree -> (Int, Int, Int)
dp' Node = (0, 0, 0)
dp' (Edge a b) = let
(a1, a2, a3) = dp' a
(b1, b2, b3) = dp' b in
(min (a2 + b1) (a3 + b1)
,min (a1 + 1 + b2) (a3 + b2)
,min (a1 + 1 + b3) (a2 + 1 + b3)
)
例如,值(a1+1+b2)
表示设置根(a)->1
和根(b)->2
的成本,因为根(a)
的值小于根(b)
的值,并且根(a)
的父项是根(b)
,因此产生了1
的额外成本
总的答案是
dp :: Tree -> Int
dp a = let (a1, a2, a3) = dp' a in min (min a1 a2) a3
树是二进制的,对吗?没必要你在哪里卡住了?有一种自然的方法可以将DP应用于树(因为子树是可以单独解决的较小问题)——因此,这可能是您的第一条攻击线。我应该如何处理树的叶子?我知道我可以递归地找到解决方案,但如何停止?@Rotem相关行是dp'Node=(0,0,0)
;叶子本身不需要任何颜色的费用。我可以这样定义它吗?(递归)->Cost(node,value)=节点的所有子节点的min(Cost(node.child,value'))之和+计数器(如果value'时间复杂度是多少?@Rotem它是线性的。我如何递归执行?我考虑将所有子节点的Cost(node,value)定义为=min(Cost(node.child,value'))但我不知道停止条件是什么。如果节点没有子节点,则表示它是一个叶,您应该停止递归。这是正常DFS实现的一部分。