解题思路:记忆化搜索(深度搜索+动态规划)+树
观察题目发现可以将学校各教职工关系构建成一颗树,由题目限制可得,对于树中任意一个节点都应该有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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复