将 Tree 转换为具有 K 个叶子且成本最低

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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]中。

【讨论】:

以上是关于将 Tree 转换为具有 K 个叶子且成本最低的主要内容,如果未能解决你的问题,请参考以下文章

PSO基于PSO粒子群优化的物料点货物运输成本最低值计算matlab仿真,包括运输费用代理人转换费用运输方式转化费用和时间惩罚费用

tree状数据叶子节点与根节点等的递归转换

mysql为什么用b+树做索引

将 XmlNode 转换为 XNode?

[CF1065F]Up and Down the Tree

2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的