首先虽然这道题说的是树形DP的事情,但是其实本质上还是考察DFS的事情,说起深搜,自己的理解还是太浅了,一开始对这道题的理解是,默认题目里说的最长链说的是一定会经过俩个叶节点,但是不一定会经过根节点。但是实质上根节点不一定在最长链的通路上。而我一开始实现的操作还是利用了上学期的数据结构的利用递归实现求树的深度。
这个时候深搜的作用就被大大消减。深度优先搜索实质上是一种算法,一种思想,而不是应该被拘束在函数返回值里,在搜索的过程中,完全可以进一步的采取操作,比如这道题的实时更新最大值。这种实时的更新,可以保持最大值更新,其实本质上算法还是递归寻找的问题,但是修改了Depth函数后在函数内部也可以实现。
还有就是从简单的Depth函数过渡到,要想到用一个全局数组来实现存储和记录的功能。
#include <algorithm> #include <iostream> using namespace std; const int Maxlen = 1e5 + 10; int l[Maxlen],r[Maxlen],Depth[Maxlen]; int ans=0; int DFS(int k); int main(){ int n,x,y,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d %d",&x,&y); l[i]=x; r[i]=y; } ans=max(ans,DFS(1)); printf("%d\n",ans-1); return 0; } int DFS(int k){ if(k==0) return 0; Depth[l[k]]=DFS(l[k]); Depth[r[k]]=DFS(r[k]); ans=max(ans,Depth[l[k]] + Depth[r[k]] + 1); return Depth[k]=max(Depth[l[k]] ,Depth[r[k]]) + 1; }