题意就不说了,只要学过英语的,肯定能看懂。
首先分析一下,发现是一颗树,那么我们另
f[i][0]表示以i为根,i不去能达到的最大快乐值;f[i][1]表示以i为根,i参加聚会能达到的最大快乐值。
那么:
f[i][0]=sigma( max( f[i的孩子节点][0],f[i的孩子节点][1] ) );
f[i][1]=sigma(f[i的孩子节点][0])+val[i];
程序实现的时候,我先初始化:f[i][1]=val[i],f[i][0]=0;
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAX 6111
using namespace std;
int root,n;
int val[MAX],next[MAX],head[MAX],f[MAX][2];
bool isson[MAX];
void init()
{
int i,j;
int L,K;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
for(i=1;i<n;i++)
{
scanf("%d%d",&L,&K);
next[L]=head[K];
head[K]=L;
isson[L]=true;
}
for(i=1;i<=n;i++)
if(!isson[i])
root=i;
}
void DP(int u)
{
if(!u) return ;
int v;
f[u][1]=val[u];
f[u][0]=0;
for(v=head[u];v;v=next[v])
{
DP(v);
f[u][0]+=max(f[v][0],f[v][1]);
f[u][1]+=f[v][0];
}
}
int main()
{
int i,j;
init();
DP(root);
printf("%d\n",max(f[root][0],f[root][1]));
return 0;
}