sad


私信TA

用户名:dotcpp0636157

访问量:601

签 名:

等  级
排  名 2279
经  验 2291
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 asd
专  业

  自我简介:

TA的其他文章

最多约数问题
浏览:83
核电站问题
浏览:14

解题思路:记忆化搜索(深度搜索+动态规划)+树

观察题目发现可以将学校各教职工关系构建成一颗树,由题目限制可得,对于树中任意一个节点都应该有1.自己来,学生不来。2.自己不来,学生来或学生不来两种情况,而对于这两种情况,1=自己的活跃度+学生不来的活跃度。2=各个学生来或者不来分别最大的活跃度之和,因此使用深度优先可以轻松的从叶子节点开始逐步向上直到根节点将1、2两种情况分别求出来。

注意事项:

参考代码:

n=int(input())
happy=[]
lis = [[0] for i in range(n+1)]
dp = [[0]*(3) for i in range(n+1)]//1、2、3分别为当前节点来的情况下与其子树的和,不来的情况下与其子树的和,最大值。
happy.append(0)
for i in range(1,n+1):
   happy.append(int(input()))
while True:
   x,y=map(int,input().split())
   if(x==0 and y==0 ):
       break
   lis[x][0]=y
   lis[y].append(x)
for i in range(1,n+1):
   if(lis[i][0]==0):
       lis[0].append(i)
def DP(param):
   dp[param][1] = 0
   dp[param][0]=0
   for i in range(1,len(lis[param])):
       child=lis[param][i]
       DP(child)
       dp[param][0]+=dp[child][2]//若当前节点不存在,则将其子树的最大值加上,对应第二种情况。
       dp[param][1]+=dp[child][0]//若当前节点存在,则将其子节点不来情况下的子树最大值加上,与下一条语句构成对应第一种情况。
   dp[param][1]+=happy[param]
   if dp[param][0]>=dp[param][1]://判断本节点来与不来那种情况活跃度最大并保存到DP[x][2]
       dp[param][2]=dp[param][0]
   else:
       dp[param][2] = dp[param][1]
DP(0)
print(dp[0][2])

 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区