题目链接
参考 左程云-树形dp上
简单的树形dp 但是多叉树
树形dp就是向子节点索要多可能的答案,以一个整体的方式去返回
如本题中可能需要子节点参加和子节点不参加两个子节点信息,本处以两个数组存放信息
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 6e3 + 2;
int happy[N] = {0};
vector<int> graph[N]; //每个父节点都有孩子数组
int yes[N] = {0};
int no[N] = {0};
void f(int u);
bool boss[N] = {0}; //是否为最终父节点
signed main(){
int n, h; cin>>n;
for(int i=1;i<=n;i++){
cin>>happy[i];
}
for(int i=1;i<=n;i++)
boss[i] = true;
for(int i=1, l, k;i<=n-1;i++){
cin>>l>>k;
graph[k].push_back(l);
boss[l] = false;
}
//找到最终根节点
for(int i=1;i<=n;i++){
if(boss[i]){
h = i;
break;
}
}
f(h);
cout<<max(yes[h], no[h])<<endl;
return 0;
}
void f(int u){
no[u] = 0;
yes[u] = happy[u];
//走每个子节点,收集答案 两种可能结果,分别收集
for(int x : graph[u]){
f(x);
no[u] += max(yes[x], no[x]);
yes[u] += no[x];
}
}