基本树型dp。dp[i][j]中i表示某人,j表示该人来了没来。转移方程见程序。
注意预处理:先初始化所有dp[i][1]为给定的权值。先将没有下属的人进队。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int n,r[6005],fath[6005],num[6005]; int dp[6005][3]; void bfs() { queue <int> q; for (int i=1;i<=n;i++) if (num[i]==0) q.push(i); while (!q.empty()) { int head=q.front(); q.pop(); dp[fath[head]][0]+=max(dp[head][0],dp[head][1]); dp[fath[head]][1]+=dp[head][0]; num[fath[head]]--; if (num[fath[head]]==0) q.push(fath[head]); } } int main() { memset(num,0,sizeof(num)); scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&r[i]); dp[i][1]=r[i]; } for (int i=1;i<=n-1;i++) { int x,y; scanf("%d%d",&x,&y); fath[x]=y; num[y]++; } int yjq_naive,cx_ak; scanf("%d%d",&yjq_naive,&cx_ak); bfs(); int maxn=0; for (int i=1;i<=n;i++) for (int j=0;j<=1;j++) maxn=max(maxn,dp[i][j]); printf("%d\n",maxn); return 0; }
原文:http://www.cnblogs.com/ziliuziliu/p/5106658.html