我有这个问题:
给你一个有根的树T,代表公司的层次结构,和 你想用T,1,2或3整数标记T中的每个节点,这样每个节点都有一个 与其父母不同的标签。标签的成本是具有的节点数 比父母更小的标签。描述和分析计算算法 给定树的任何标签的最低成本T.
如何使用动态编程解决此问题?
答案 0 :(得分:0)
对于每个节点i
,您需要计算其子树标记的最低成本,假设当前节点i
具有标签1
,2
或{{ 1}}。
知道当前节点的每个子节点的那些值,就可以计算当前节点的这些值。
您可以使用3
种算法实现它。
答案 1 :(得分:0)
谢尔盖有正确的想法,但由于这是一般树,因此在组合步骤中有一些微妙之处,应避免指数爆炸。
让我们使用以下数据结构表示树。
data Tree = Node | Edge Tree Tree
在英语中,树是单个节点或子树,其根是整个根的子节点和树的其余部分。例如,树
*
/|\
* * *
|
*
表示为Edge Node (Edge (Edge Node Node) (Edge Node Node))
。
现在,让我们定义一个递归过程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)
表示设置root(a) -> 1
和root(b) -> 2
的费用,因1
&#39而产生root(a)
的额外费用; s值小于root(b)
的值,root(a)
的父级为root(b)
。
总体答案是
dp :: Tree -> Int
dp a = let (a1, a2, a3) = dp' a in min (min a1 a2) a3