本题会有大规模测试用例,用深度优先搜索可能会超出迭代次数上限。也许可以通过手动指定迭代次数上限来解决这个问题,但我选择维护动态规划列表。

本质上和前两道打家劫舍没有什么区别,难度虚高了。

n = int(input())
pts = list(map(int, input().split()))  # points
fas = list(map(int, input().split()))  # fathers

# 建树:sons[idx]是idx的子节点。节点编号从0开始。
sons = dict()
for idx in range(1,n):
    fa = fas[idx] - 1
    if fa in sons:
        sons[fa] += [idx]
    else:
        sons[fa] = [idx]

dfs = [0 for idx in range(n)]
# 初始化:叶子结点
for idx in range(n):
    if idx not in sons:
        dfs[idx] = pts[idx]
        
# 迭代:同一般“打家劫舍”
for idx in range(n)[::-1]:
    # y:偷这家,所以用这家的得分加上所有孙子节点的得分之和;n:不偷这家,得分等于子节点得分之和
    y,n = pts[idx],0
    if idx not in sons:
        continue
    for son in sons[idx]:
        n += dfs[son]
        if son in sons:
            y += sum([dfs[gson] for gson in sons[son]])
    dfs[idx] = max(y, n)

print(dfs[0])