最大子树和——树形dp
P1122 最大子树和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
一道很好的树形dp基础题。但是自己因为刚开始刷的题被限制了思路。。。。其实这道题很简单。
首先是无向图存储。
dfs遍历,如果是子节点,并且子节点的总值大于0,那就加上,不然不要。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }