牛客 打家劫舍(三)(python)

这篇博客讨论了一个基于二叉树结构的小区盗窃问题,其中每个房间都有现金,但不能同时盗窃相邻的房间。作者提出了一种使用深度优先搜索的解决方案,并给出了两个具体的例子来解释算法如何找到最大盗窃金额。尽管作者在ACM模式下遇到了困难,但仍然成功实现了树模型并进行了DFS遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你是一个经验丰富的小偷,经过上次在街边和湖边得手后你准备挑战一次自己,你发现了一个结构如二叉树的小区,小区内每个房间都存有一定现金,你观察到除了小区入口的房间以外每个房间都有且仅有一个父房间和至多两个子房间。
问,给定一个二叉树结构的小区,如之前两次行动一样,你无法在不触动警报的情况下同时偷窃两个相邻的房间,在不触动警报的情况下最多的偷窃金额。

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)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁lingling哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值