你是一个经验丰富的小偷,经过上次在街边和湖边得手后你准备挑战一次自己,你发现了一个结构如二叉树的小区,小区内每个房间都存有一定现金,你观察到除了小区入口的房间以外每个房间都有且仅有一个父房间和至多两个子房间。
问,给定一个二叉树结构的小区,如之前两次行动一样,你无法在不触动警报的情况下同时偷窃两个相邻的房间,在不触动警报的情况下最多的偷窃金额。
1.如果输入的二叉树是
5
2 1 2 2 1
0 1 1 2 3
那么形状结构如下:
小区入口的房间的值是2 ,偷窃第一层2和第三层 2,1 是最优方案。
2.如果输入的二叉树是
3
3 2 10
0 1 1
那么形状结构如下:
样例2:小区入口的房间的值是3 ,偷窃第二层 2,10 是最优方案。
之前一直使用leetcode写的
结果之后到笔试的时候不适应ACM模式
这次尝试在ACM模式里面自己建立tree模型
深度优先在牛客里面跑不了 太难了
n = int(input())
value = [-1] + [int(x) for x in input().split()]
father = [int(x) for x in input().split()]
tree = [[] for _ in range(n+1)]
global money
root,money = 0,0
for i,p in enumerate(father):
if p == 0:
root = i+1
continue
tree[p].append(i+1)
def dfs(root):
global money
if not root: return [0,0]
result = [value[root],0]
for i,k in enumerate(tree[root]):
sub = dfs(k)
result[0] += sub[1]
result[1] += sub[0]
money = max(money,result[0],result[1])
return [max(result),result[1]]
dfs(1)
print(money)