栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/875567.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号