根定向路径的最大数量

时间:2017-12-01 10:05:08

标签: algorithm recursion graph dynamic-programming

我得到了这个问题,我必须用递归方法解决,并基于递归方法来构建动态编程解决方案。 我将非常感谢您的帮助,主要是递归解决方案。

给定根树T和数字K.根定向路径被定义为每个顶点是路径中他之前的顶点的父节点的路径。 目标:找到T中长度为k的根定向路径的最大dinstinct(无公共顶点)数

例如:对于图片中的树和k = 3,答案是:3 example

1 个答案:

答案 0 :(得分:0)

DP_in(u,k)定义为k中带有u的子树中的长度为u的根定向路径的不同(不常见顶点)的最大数量(不是公共顶点)路径。

此外,将DP_out(u,k)定义为k u树根子u中长度为DP_out(u,k)的根定向路径的最大不同(无共同顶点)数量u不在任何路径中。

我将首先处理k。如果u不在任何路径中,那么您需要长度为DP_out(u,k)=Sum i=1 to r [max(DP_in(v_i, k-1), DP_out(v_i, k)) ]的最大根定向路径,这些路径是v_1, ..., v_r的任何子项的子根。所以我们有:

u其中DP_in(u,k)u的孩子。

u而言,由于u位于路径中,因此DP_in(u,k)= max (DP_in(v_i, k-1)+ Sum j=1 to r, j=/=i [max(DP_in(v_j, k-1), DP_out(v_j, k))] )中的一个且只有一个孩子必须位于包含i=1,...,r.的路径中}。因此我们有:

r超过max( DP_in(r,k), DP_out(r,k))

如果O(n^2)是树的根节点,那么您想要的答案实际上是DP_out(u,k)

您可以从树的底部(叶子)同时构建DP表并向上运行以确保填充表的顺序正常。

我们知道存在O(n)个子问题,DP_in(u,k)的每个子问题都可以在O(n^2)中计算,而O(n^4)的每个子问题都可以在{{1}中计算天真的。总共最糟糕的情况channel.sendInstantiationProposal(instantiateProposalRequest, company.getPeers());

请注意,我当然不会声称我的方法是最优的方法,很可能是稍微优化的方式(使用某些DS),但是,如果您对此感兴趣,我会留下您的方法它