压栈了,只有一半的分,一来自己一点点写的
二来希望大佬们帮我看看如何改进。
dp[i][0] 表示不选这个节点 此时递推式应为:(j为子节点)
dp[i][0]=max(dp[j][0],dp[j][1],dp[i][0])
dp[i][1]表示选这个节点此时应为:
dp[i][1]=sum(max(dp[j][1],0))+val(i)
上代码
import sys
sys.setrecursionlimit(10000000) #不解上限只过三个
n=int(input())
nums=list(map(int,input().split()))
tree=[[]for i in range(n+1)]
for i in range(n-1):
a,b=map(int,input().split())
tree[a].append(b)
tree[b].append(a)
dp=[[0 for i in range(2)]for i in range(n)]
def dfs(u,path):
global dp,tree
if not tree[u]:
dp[u-1][1]=nums[u-1]
print(dp[u-1][1])
return
for i in tree[u]:
if i not in path :
dfs(i,path+[i])
dp[u-1][0]=max(dp[i-1][0],dp[i-1][1],dp[u-1][0])
dp[u-1][1]+=max(dp[i-1][1],0)
dp[u-1][1]+=nums[u-1]
return
for i in range(1,n+1):
if tree[i]:
dfs(i,[i])
break
print(max(dp[i-1][0],dp[i-1][1]))