给定一个具有n个节点(编号从1到n)和n-1条边的树。每条边都有两个与之关联的整数,一个权重和一个增益。你也会得到一个数字K,你可以从任何节点开始,你必须进行交易。在每笔交易中,你损失的金额等于边缘的权重,而赚取的利润等于边缘的增益值。你必须最大化利润,这样总的损失金额<=K
这里有一个指向原始问题的链接。相应的比赛现在结束了。
https://www.hackerrank.com/contests/gs-quantify-2017/challenges/profit-maximization
我做了什么:
我构建了一种递归方法,将每个节点视为路径的起始节点,然后通过考虑遵守约束的每个后续节点来递归计算最大利润。
但很明显,这具有非常高的时间复杂度。
有没有更优雅、更省时的方法呢?
发布于 2017-10-15 05:49:28
这里有一个建议:
要计算使用特定节点x的解决方案的利润,您可以使用DFS来计算到达每个节点的总权重和利润。
然后,对于x的每个子子树:
然后,您可以合并这些子树,以找到包含x的任何路线的最大利润:
请注意,步骤2和步骤3在要合并的条目数量上都是线性的。
如果有很高的分支因子,那么合并步骤可能会变得太慢,在这种情况下,您可以通过始终合并两个最小的子树来提高效率,而不仅仅是按顺序合并。堆数据结构可以有效地告诉您哪两个是最小的。
可能有一个简单得多的解决方案,Hackerrank通常会在一段时间后发布社论,所以在未来重新检查你的问题链接是值得的。
https://stackoverflow.com/questions/46746479
复制相似问题