输入样例:
7
1
1
1
1
1
1
1
1 3
7 4
2 3
4 5
6 4
3 5
0 0
输出样例:
5
(虽然题目说的多组数据,但我试了下实际上只有一组数据。。。)
f[i][0]表示第i个人不去时最大的快乐值,f[i][1]表示第i个人去时最大的快乐值。
转移方程:
f[i][0]+=max(f[j][0],f[j][1]),如果第i个人不去,那么他的下属,第j个人,可能去也可能不去
f[i][1]+=f[y][0],如果第i个人去,那么他的下属都不能去
完整代码:
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
int N;
int happy[6100];
int f[6100][2];
int pa[6100];
vector<int> tree[6100];
void dfs(int x)
{
f[x][0]=0;
f[x][1]=happy[x];
for(int i=0;i<tree[x].size();i++)
{
int y=tree[x][i];
dfs(tree[x][i]);
f[x][0]+=max(f[y][1],f[y][0]);
f[x][1]+=f[y][0];
}
}
int main()
{
cin>>N;
int a,b;
memset(happy,0,sizeof(0));
memset(pa,0,sizeof(0));
for(int i=1;i<=N;i++)
{
cin>>happy[i];
}
for(int i=1;i<=N-1;i++)
{
cin>>a>>b;
tree[b].push_back(a);
pa[a]=1;
}
int root;
for(int i=1;i<=N;i++)
{
if(pa[i]!=1)
root=i;
}
dfs(root);
cout<<max(f[root][0],f[root][1])<<endl;
}