最大子树和——树形dp

P1122 最大子树和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一道很好的树形dp基础题。但是自己因为刚开始刷的题被限制了思路。。。。其实这道题很简单。

首先是无向图存储。

dfs遍历,如果是子节点,并且子节点的总值大于0,那就加上,不然不要。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=16200;
 4 int ans=-2147483647;
 5 int a[N],f[N],n;
 6 vector<int> e[N];
 7 
 8 void dfs(int u,int fa)
 9 {
10     f[u]=a[u];
11     for(int i=0;i<e[u].size();i++)
12     {
13         int y=e[u][i];
14         if(y!=fa)
15         {
16             dfs(y,u);
17             if(f[y]>0)f[u]+=f[y];
18         }
19     }
20 }
21 
22 int main()
23 {
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
26     
27     int x,y;
28     for(int i=1;i<=n-1;i++)
29     {
30         scanf("%d%d",&x,&y);
31         e[x].push_back(y);
32         e[y].push_back(x);
33     }
34     
35     dfs(1,0);
36     for(int i=1;i<=n;i++)ans=max(ans,f[i]);
37     printf("%d\n",ans);
38     
39     return 0;
40 }
View Code

 

posted @ 2022-04-05 17:38  wellerency  阅读(14)  评论(0编辑  收藏  举报