[BOJ 13325, Python] 二进制树
BOJ 13325 "二叉树 "问题的 Python 解决方案
问题链接
分类
动态程序设计, 树, 树中的动态程序设计
描述
如果你和我一样,是那种即使不能马上解决问题,也会长期坚持的人!
이미지를 불러올 수 없습니다.
于是,那些我尝试了却无法解决的问题,那些我努力了却无法解决的问题,就这样和竞赛题一起堆积起来......
为了摆脱它们,我有时会通读试题,细细咀嚼,真庆幸今天终于在这篇文章中找到了解决办法!
이미지를 불러올 수 없습니다.
距离我第一次尝试已经过去 8 个月了,上次尝试后我又修补了几次,但似乎都没有效果。
def pre_order_detail(graph_dict: dict, target_node: int = 1) -> list:
result = [target_node]
if len(graph_dict[target_node]) >= 1:
for each_element in pre_order_detail(graph_dict, graph_dict[target_node][0]):
result.append(each_element)
result.append(target_node)
if len(graph_dict[target_node]) >= 2:
for each_element in pre_order_detail(graph_dict, graph_dict[target_node][1]):
result.append(each_element)
result.append(target_node)
return result
我最初的想法是使用类似上述递归函数形式的潜在遍历的变体,拍摄访问节点的图片,将其放入类似堆栈的数据结构中,然后遍历每个主干。
不过,经过思考,我意识到如果将比较对象限定为来自同一父节点的树干,那么只需将两个值中较大的一个加到父树干上,这样会更简洁!
后来,我解决了这类问题,并将其归类为树形 DP。我认为它与 DP 非常相似。
解题代码
# 이진 트리
import sys
input = sys.stdin.readline
tree_height = int(input())
node_number = pow(2, tree_height + 1)
edges = [0] + list(map(int, input().split()))
edge_sum = sum(edges)
now_start = node_number // 2 - 1
now_end = node_number - 1
while now_end:
for i in range((now_end - now_start) // 2):
child_edge = now_start + (2 * i)
next_node = child_edge // 2
edges[next_node] += max(edges[child_edge], edges[child_edge + 1])
edge_sum += abs(edges[child_edge] - edges[child_edge + 1])
now_end = now_start
now_start = now_start // 2
print(edge_sum)
代码长度和时间复杂度比我们最初想象的要简单。现在我们把代码编排成这样,肯定是自下而上的。
댓글 작성
게시글에 대한 의견을 남겨 주세요.