AcWing 1116. DFS思考
原题链接
简单
作者:
debroo
,
2024-11-26 20:08:48
,
所有人可见
,
阅读 4
DFS反思:
1,想象出来一颗树
2,关注中间节点和最后一个节点
设置中间参数res/ans/cnt之类
1. 然后在dfs过程中更新:
2. 通过cnt += 1
3. 通过res += dfs()
4. 一般在循环外return ans
关注树中间节点,即关注这些参数的更新
最后一个节点的更新重点在于dfs开头和结尾的return,它反映如何向上传递
而循环体中的dfs关心如何向下传递
def dfs(y,x):
ans = 1 #该节点的性质
ans += dfs(ny,nx) #加上了子树的值
我认为应该是有一些常用的惯式
- 保存子树属性:
def dfs():
sum = 0
#这里意味着对每一个节点初始化
#(最后一个节点初始化为0),这里从下往上想容易一些
sum += dfs()
return sum+1
- 保存当前路径的属性(步数/累加的和)
#不需要return
def dfs():
global ans
ans += 1
dfs()
def dfs(ans):
ans = max(dfs(),ans)
#思考return,从最后一节点往前模拟
#如果不是树(最后一个节点属性可以初始化0/1,从下往上累加)
#甚至越到后面属性越大(是一个累加的过程,从上往下累加)
#那么如果不用全局变量保存这条路径的属性,则需要通过传参,将属性传递下去
def dfs(res):
max_res = res #表示从上一节点继承,max_res代表当前节点
max_res = max(max_res,dfs()) #表示当前节点
return max_res #将更新后的值返回给上一节点
#max_res=res,
#max_res = max(), 对
有点难得想,max算的上这条路径