如何确定访问有根树的 k 个叶节点的最小步骤?
How do I determine minimum steps to visit k leave node of a rooted tree?
算法即将访问 k 个离开节点并return返回根节点以最少的步骤!!
认为这是一个人站在第 2 点,he/she 想以最少的步数访问树的 k 个叶子,然后回到第 2 点。
对于 k=3 路径可以像
2-> "3" ->2->1-> "0" ->1-> "5" ->1->2 (这里3,0,5是叶子)
所以我们参观了 3 个级别..
答案:8
这是有根树上的另一个 bottom-up 动态程序。
对于每个子树,我们计算访问至少 j
个叶子 j in 0…k
的成本作为列表。如果子树是单片叶子,那么这个列表就是[0, 0, ∞, ∞, …, ∞]
,其中∞
表示无穷大,代表一个不可行的叶子数量。否则,我们为每个 child 计算列表,将每个列表中除第一个之外的所有条目增加 2
,然后通过卷积减少。对两个列表 A
和 B
进行卷积就是计算 [min {A[i] + B[j-i]: i in 0…j}: j in 0…k]
。 Return 根的 k
条目。
这是O(n k^2)
时间。
算法即将访问 k 个离开节点并return返回根节点以最少的步骤!!
认为这是一个人站在第 2 点,he/she 想以最少的步数访问树的 k 个叶子,然后回到第 2 点。
对于 k=3 路径可以像
2-> "3" ->2->1-> "0" ->1-> "5" ->1->2 (这里3,0,5是叶子) 所以我们参观了 3 个级别..
答案:8
这是有根树上的另一个 bottom-up 动态程序。
对于每个子树,我们计算访问至少 j
个叶子 j in 0…k
的成本作为列表。如果子树是单片叶子,那么这个列表就是[0, 0, ∞, ∞, …, ∞]
,其中∞
表示无穷大,代表一个不可行的叶子数量。否则,我们为每个 child 计算列表,将每个列表中除第一个之外的所有条目增加 2
,然后通过卷积减少。对两个列表 A
和 B
进行卷积就是计算 [min {A[i] + B[j-i]: i in 0…j}: j in 0…k]
。 Return 根的 k
条目。
这是O(n k^2)
时间。