洛谷 P1352 没有上司的舞会

P1352 没有上司的舞会

树形dp

dp[i][0]表示第i个人没有来的活跃值

dp[i][1]表示第i个人来了的活跃值

第i个人来时,他的直接下属就不可以来  所以  如果k是他的直接下属的话  dp[i][1]+=dp[k][0]

第i个人不来,他的直接下属可以来也可以不来 所以  如果k是他的直接下属的话  dp[i][0]+=max(dp[k][0],dp[k][1])

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 1000000
 4 int n,m,fa[maxn],root,dp[maxn][2],x,y;
 5 bool vis[maxn];
 6 
 7 void tree_dp(int x)
 8 {
 9     vis[x]=1;
10     for(int i=1;i<=n;i++)
11     {
12         if(!vis[i]&&fa[i]==x)
13         {
14             tree_dp(i);
15             dp[x][1]+=dp[i][0];
16             dp[x][0]+=max(dp[i][1],dp[i][0]);
17         }
18         
19     }
20 }
21 
22 int main()
23 {
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++) scanf("%d",&dp[i][1]);
26     for(int i=1;i<n;i++)
27     {
28         scanf("%d%d",&x,&y);
29         fa[x]=y; root=x;
30     }
31     scanf("%d%d",&x,&y);
32     while(fa[root]) root=fa[root];
33     tree_dp(root);
34     printf("%d\n",max(dp[root][0],dp[root][1]));
35     return 0;
36 }
View Code

 

posted @ 2017-09-12 19:21  Alex丶Baker  阅读(117)  评论(0编辑  收藏  举报