动态规划帮助:二叉树成本边

Posted

技术标签:

【中文标题】动态规划帮助:二叉树成本边【英文标题】:Dynamic Programming Help: Binary Tree Cost Edge 【发布时间】:2012-03-08 16:55:07 【问题描述】:

给定一棵有 n 个叶子和一组 C 颜色的二叉树。树的每个叶节点都被赋予来自集合 C 的唯一颜色。因此没有叶节点具有相同的颜色。树的内部节点是无色的。集合 C 中的每一对颜色都有与之相关的成本。因此,如果树边连接颜色 A 和 B 的两个节点,则边成本是对 (A, B) 的成本。我们的目标是为树的内部节点赋予颜色,从而最小化树的总边缘成本。

我已经研究这个问题几个小时了,但还没有真正想出一个可行的解决方案。任何提示将不胜感激。

【问题讨论】:

请问这个问题出自哪里?它来自任何活跃的算法竞赛吗? 不,不是为了任何比赛。 好的,那我很乐意帮助你。您能对任务的限制有所了解吗?有多少种颜色可供您使用?树中有多少个节点。 谢谢 :) 没有限制。只有 n 个节点和 C 种颜色。树是二叉树,它可以有任何结构。所有的叶子节点必须是不同的颜色。这些是算法的唯一限制。 如果你想使用动态编程,要问的问题可能是:“假设我们已经最优地绘制了一个子树;如果我们将此子树附加到父级,我们如何为父级着色并更新保持最优性的子树?” - 对于两个儿子的父母,同样的问题。当您将子树附加到父级时,您必须更新子树多深? 【参考方案1】:

我打算用伪代码来解决这个问题,因为我试着写解释,即使对我来说也完全无法理解。希望代码能解决问题。我的解决方案的复杂性不是很好 - 在 O(C^2 * N) 中存储一个运行时。

我将需要几个数组,我将在动态方法中使用您的任务:dp [N][C][C] -> dp[i][j][k] 如果您绘画,您可以从以节点 i 为根的树获得的最高价格它的颜色为j,其父节点的颜色为kmaxPrice[N][C] -> maxPrice[i][j] 如果其父节点的颜色为@ 987654330@color[leaf] -> 叶子的颜色 leafprice[C][C] -> price[i][j] 如果您有一对颜色为 ij 的相邻节点,您将获得的价格 chosenColor[N][C] -> chosenColor[i][j] 为节点i 选择颜色以获得maxPrice[i][j]

假设节点使用topological sorting 排序,即我们将处理第一个叶子。拓扑排序在树中很容易做到。让排序已经给出了内部节点列表inner_nodes

for leaf in leaves:
   for i in 0..MAX_C, j in 0..MAX_C
       dp[leaf][i][j] = (i != color[leaf]) ? 0 : price[i][j]
   for i in 0..MAX_C,
       maxPrice[leaf][i] = price[color[leaf]][i]
       chosenColor[leaf][i] = color[leaf]
for node in inner_nodes
   for i in 0..MAX_C, j in 0..MAX_C
       dp[node][i][j] = (i != root) ? price[i][j] : 0
       for descendant in node.descendants
           dp[node][i][j] += maxPrice[descendant][i]
   for i in 0...MAX_C
       for j in 0...MAX_C
         if maxPrice[node][i] < dp[node][j][i]
             maxPrice[node][i] = dp[node][j][i]
             chosenColor[node][i] = j

for node in inner_nodes (reversed)
   color[node] = (node == root) ? chosenColor[node][0] : chosenColor[node][color[parent[node]]

【讨论】:

【参考方案2】:

作为起点,您可以使用贪心解决方案,它为您提供总成本的上限:

while the root is not colored
    pick an uncolored node having colored descendants only
        choose the color that minimizes the total cost to its descendants

【讨论】:

以上是关于动态规划帮助:二叉树成本边的主要内容,如果未能解决你的问题,请参考以下文章

动态规划之最优搜索二叉树(2021/3/13)

监控二叉树(基于二叉树的动态规划)(后序遍历的进阶)

监控二叉树(基于二叉树的动态规划)(后序遍历的进阶)

动态规划--打家劫舍III (二叉树版)

算法初级--树+排序和搜索+动态规划

leetcode 746. 使用最小花费爬楼梯----动态规划篇