Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 标记顶点以创建最小成本_Algorithm_Dynamic - Fatal编程技术网

Algorithm 标记顶点以创建最小成本

Algorithm 标记顶点以创建最小成本,algorithm,dynamic,Algorithm,Dynamic,我有一个问题: 给您一个根树T,表示公司的层次结构,和 您希望用整数1、2或3标记T中的每个节点,以便每个节点都有一个 与其父项不同的标签。标记的成本是已标记的节点数 比他们的父母小的标签。描述并分析一种算法来计算 给定树T的任何标记的最小成本 如何使用动态规划解决此问题?对于每个节点I,假设当前节点I具有标签1、2或3,则需要计算其子树的最小标签成本。 了解当前节点的每个子节点的这些值,可以计算当前节点的这些值 您可以使用深度优先搜索一种算法来实现它。Sergey的想法是正确的,但由于这是一个

我有一个问题:

给您一个根树T,表示公司的层次结构,和 您希望用整数1、2或3标记T中的每个节点,以便每个节点都有一个 与其父项不同的标签。标记的成本是已标记的节点数 比他们的父母小的标签。描述并分析一种算法来计算 给定树T的任何标记的最小成本


如何使用动态规划解决此问题?

对于每个节点
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实现的一部分。