第一次见树形dp,就是整棵树的问题划分为子树的问题,然后递推,用搜索实现
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=16000+3;
int n,u,v,t;
int val[maxn],sum[maxn];
vector<int> G[maxn];
int DFS(int y,int x)//x是前驱,y是当前节点
{
sum[y]=val[y];//先把当前节点的值存起来,然后遍历以这个点为根的子树
for(int i=0;i<G[y].size();i++)
{
t=0;
if(G[y][i]!=x)
t=DFS(G[y][i],y);
if(t>0) sum[y]+=t;//如果子树值大于零就加上
}
return sum[y];//返回整棵树的最优解
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&val[i]);
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
DFS(1,-1);
int ans=-1e8;
for(int i=1;i<=n;i++)
ans=max(ans,sum[i]);
printf("%d\n",ans);
return 0;
}