树形dp
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int MAXN=(int)6e3+10; 8 9 int n; 10 int r[MAXN]; 11 bool flag[MAXN]; 12 vector<int> vec[MAXN]; 13 int dp[MAXN][2]; //i号职员去(1)或不去(0)的快乐指数 14 15 void dfs(int u) 16 { 17 dp[u][0]=0; 18 dp[u][1]=r[u]; 19 for (int i=0;i<(int)vec[u].size();i++) 20 { 21 int v=vec[u][i]; 22 dfs(v); 23 //类似pushUp,求出子树的dp再向上更新根结点的dp 24 dp[u][0]+=max(dp[v][0],dp[v][1]); 25 dp[u][1]+=dp[v][0]; 26 } 27 return; 28 } 29 30 int main() 31 { 32 scanf("%d",&n); 33 for (int i=1;i<=n;i++) scanf("%d",&r[i]); 34 memset(flag,false,sizeof(flag)); 35 36 for (int i=1;i<n;i++) 37 { 38 int l,k; 39 scanf("%d%d",&l,&k); 40 vec[k].push_back(l); 41 flag[l]=true; 42 } 43 44 int rt; 45 for (int i=1;i<=n;i++) //求根结点(校长) 46 { 47 if (!flag[i]) 48 { 49 rt=i; 50 break; 51 } 52 } 53 54 dfs(rt); 55 printf("%d\n",max(dp[rt][1],dp[rt][0])); 56 57 return 0; 58 }