【问题标题】:Transform Tree to have K leaves with minimum cost将 Tree 转换为具有 K 个叶子且成本最低
【发布时间】:2018-02-08 21:51:33
【问题描述】:

给了我一棵树,我必须删除节点才能用 k 个叶子转换树。每个节点都有一个与之关联的权重。删除节点将花费相关的权重。我想把成本降到最低。

这里是问题的链接-:http://www.iarcs.org.in/inoi/online-study-material/topics/dp-trees.php

我无法想象解决方案。我需要帮助。如果有人可以广泛地解释或提供一些文档会有所帮助。

【问题讨论】:

    标签: algorithm graph dynamic-programming


    【解决方案1】:

    这里有一个关于如何做到这一点的想法(您可能需要修改和添加一些东西才能使其正常工作)-

    如链接中所述,我们将使用一个二维数组(例如 dp)来存储我们的部分答案并使用它们来找到所需的答案。其次,dp[v][k] 表示对于(子树或主树的)根节点v,我们恰好需要k 个叶节点。

    基本案例 -

    对于任何叶节点 lv-

    //Case 1 - only one leaf is required so we dont need to delete any node
    dp[lv][1] = 0
    
    //Case 2 - more than 1 leaf node required which is not possible 
    dp[lv][k] = INT_MAX
    

    对于任何节点 v -

    //As no leaf is required we delete all nodes
    dp[v][0] = sum of weights of all nodes in subtree with v(including weight of v)
    

    DP-的机制-

    现在假设我们现在在一个节点 v 上,我们需要在这个节点的子树中有 k 个叶子。让我们先写它的代码,然后我会解释它是如何工作的。

    for(int i=0;i<=k;i++)
        dp[v][k]  =  min( dp[v][k], dp[left-child][i] + dp[right-child][k-i];
    

    这里left-childright-childv的左右节点。

    对于每个叶节点,有两件事是可能的,即它可以在左子树或右子树中。所以,我正在遍历所有这些状态,从不包含叶节点的左子树到包含所有叶节点的左子树,右子树也是如此。最后,将迭代中找到的最小值存储在dp[v][k]中。

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多