简单的树形dp苹果树和上下属关系那个!好久不写dp了复习一下
#include<bits/stdc++.h>
using namespace std;
vector<int>vec[100002];
int value[100002]={0},dp[100002][2]={0};
int v[100002]={0};
int dfs(int pos){
v[pos]=1;
for(int i=0;i<vec[pos].size();i++){
if(v[vec[pos][i]]==0){
dfs(vec[pos][i]); //先搜索,再计算
dp[pos][0]+=max(dp[vec[pos][i]][0],dp[vec[pos][i]][1]); //如果不选自己,那么选取下面的最大值
dp[pos][1]+=dp[vec[pos][i]][0]; //如果选择自己,那么一定下面都不选
}
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&value[i]);
dp[i][1]=value[i]; //先将选上自己赋值
}
int tmp1,tmp2;
for(int i=1;i<n;i++){
scanf("%d%d",&tmp1,&tmp2);
vec[tmp1].push_back(tmp2);
vec[tmp2].push_back(tmp1);
}
dfs(1); //我就认为跟就是1,反正一定是树形的
cout<<max(dp[1][0],dp[1][1])<<endl;
return 0;
}
//3439