我得到了这个问题,我必须用递归方法解决,并基于递归方法来构建动态编程解决方案。 我将非常感谢您的帮助,主要是递归解决方案。
给定根树T和数字K.根定向路径被定义为每个顶点是路径中他之前的顶点的父节点的路径。 目标:找到T中长度为k的根定向路径的最大dinstinct(无公共顶点)数
例如:对于图片中的树和k = 3,答案是:3 example
答案 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),但是,如果您对此感兴趣,我会留下您的方法它