最大子树和--树形dp
1.修--dp[u]+0
不修--dp[u]+sum(dp[v])
状态,边界,转移,父与子,父亲状态会由儿子组成
P1122 最大子树和 - 洛谷
#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
int n;
vector<int> mp[16111];
ll w[16111];
bool bo[16111];
ll dp[16111];
ll ma;
void dfs(int u)
{dp[u]=w[u];bo[u]=true;for(int v:mp[u]){if(!bo[v]){dfs(v);dp[u]+=max((ll)0,dp[v]);}}ma=max(ma,dp[u]);
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=n;i++){cin>>w[i];}ma=w[1];for(int i=1;i<n;i++){int a,b;cin>>a>>b;mp[a].push_back(b);mp[b].push_back(a);}dfs(1);cout<<ma;return 0;}