最近我在树上读了一个问题但是我发现在解决这个问题上遇到困难。这里是问题:修改树的动态规划
有国家具有n个城市(2到10^5)和第(n-1)的双向道路,使得这是可能的任何一对城市之间旅行。我们有1个魔卡车可城市之间旅行,但它会采取1个单位的时间(如果它的加载)和0单位时间(如果没有加载)在相邻城市之间旅行,并产品可在持有1个单位的产品。
现在,你可以在需要谁究竟2个单位的产品,不能等待超过2个单位时间任何城市的客户。
现在的问题是,我们要尽量减少给定的限制储存总数:
- 一个城市不能有一个以上的存储。
- 存储只能存储1个单位的产品。
指定国家的储存所以您可以按时填写至少第一个订单。鉴于订单可以放在任何城市。
时间限制:1秒
我曾尝试:
我能想到的最糟糕的做法是蛮力。尝试在每个城市放置存储(2^n种可能性),并检查每个城市订单是否可以在邻近城市的帮助下完成。但是时间复杂度会是(n * 2^n)。所以根本无法工作。
我想到的第二种方法是在树上以某种方式使用DP。而且我也不确定这是否是最佳选择。从上面的问题我可以确保叶子应该有一个存储肯定。我想DP是这样的,从根开始,检查孩子是否可以帮助实现它的顺序并相应地为该城市分配存储空间,以叶子为基础的情况。但问题在这里,孩子们也可以完成父母的命令,所以它是循环循环。所以,它也没有帮助我。
最后一种方法我正在考虑在答案上应用二分查找。由于答案可能在(1,n)之间,因此可以按照nLog(n)的顺序找到答案。但问题是,我想不出一种最佳的方式来分配具有给定数量的存储的城市的存储。
所以,这就是它..我努力尝试,但无法解决这个问题。任何帮助,将不胜感激。 :)
注意:我不知道他们为什么会让问题陈述如此复杂。他们可以用更简单的方式轻松解释问题。导致我无法再在网上找到这个问题。这是我猜想的代码的某处。
我想象,答案最终会变成像https://cs.stackexchange.com/a/7478 – cdo256
@ cdo256我正在阅读那篇文章,但是当他们说** Root the tree在一些任意的顶点。对于每个子树,计算最优支配集合(a)与根,(b)没有根。** 我感觉这样会使它成为2^n的顺序。没有?? –
不,它会是线性的,因为它可以做到贪婪。也就是说,它为每个节点取最大值(a)和(b)并且忘记另一个节点。 – cdo256