入门树形dp 要求选择了该节点则不能选择该节点的父亲
所以相应的状态转移方程为
dp[fa][0]+=max(dp[son][1],dp[son][0])
dp[fa][1]+=max(dp[son][0],dp[fa][1])
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
#define maxn 6005
int n,vis[maxn];
struct node
{
int v,fa;
vector<int>ch;
}s[maxn];
int dp[maxn][2];
void find(int cur)
{
vis[cur]=1;
for(int i=0;i<s[cur].ch.size();i++)
{
int e=s[cur].ch[i];
if(!vis[e])
{
find(e);
dp[cur][0]+=max(dp[e][0],dp[e][1]);
dp[cur][1]+=dp[e][0];
}
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(s,0,sizeof s);
memset(vis,0,sizeof vis);
for(int i=1;i<=n;++i)
{
scanf("%d",&dp[i][1]);
dp[i][0]=0;
}
int a,b;
while(~scanf("%d%d",&a,&b))
{
if(a==0&&b==0){break;}
s[a].fa=b;
s[b].ch.push_back(a);
}
int rt=1;
for(int i=1;i<=n;++i)
{
if(!s[i].fa)
{
rt=i;
break;
}
}
find(rt);
printf("%d\n",max(dp[rt][0],dp[rt][1]));
}
}