将 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-child
和right-child
是v的左右节点。
对于每个叶节点,有两件事是可能的,即它可以在左子树或右子树中。所以,我正在遍历所有这些状态,从不包含叶节点的左子树到包含所有叶节点的左子树,右子树也是如此。最后,将迭代中找到的最小值存储在dp[v][k]
中。
【讨论】:
以上是关于将 Tree 转换为具有 K 个叶子且成本最低的主要内容,如果未能解决你的问题,请参考以下文章
PSO基于PSO粒子群优化的物料点货物运输成本最低值计算matlab仿真,包括运输费用代理人转换费用运输方式转化费用和时间惩罚费用
2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的