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