没有上司的舞会
https://www.luogu.com.cn/problem/P1352
1.造树 2.DP
2.1 f[x][0]表示以x为根,x不参加,所得的最大快乐指数。x不参加,那么他的下属y可以参加也可以不参加,所以f[x][0]=max(f[y][0],f[y][1])
2.2 f[x][1]表示以x为根,x参加,所得的最大快乐指数。x参加了,那么他的直接属下y将不能参加,所以f[x][1]+=f[y][0];
#include <bits/stdc++.h>
using namespace std;
const int MAX=15000;
int n,a[MAX],f[MAX][2];//第二维是0,1表示不来或来
bool vis[MAX];
vector<int> gv[MAX];
inline void dp(int x)
{
f[x][0]=0;
f[x][1]=a[x];
for(int i=0;i<gv[x].size();i++)
{
int y=gv[x][i];
dp(y);
f[x][0]+=max(f[y][0],f[y][1]);
f[x][1]+=f[y][0];
}
}
int main()
{
int l,k,root=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n-1;i++)
{
cin>>l>>k;
vis[l]=true;//l有父亲k,设为真
gv[k].push_back(l);//k有一个儿子是l
}
for(int i=1;i<=n;i++)
if(!vis[i])//如果他没有父亲,说明他就是root
{
root=i;
break;
}
dp(root);
cout<<max(f[root][0],f[root][1])<<endl;//root来或不来两种情况
return 0;
}