洛谷P1352 没有上司的舞会

洛谷P1352 没有上司的舞会

方法:

树形DP

分f[n][0](不取)

和f[n][1](取)

采用递归求解,具体看代码

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 6010
 4 inline int read()
 5 {
 6     char c;int sign=1;
 7     while((c=getchar())<'0'||c>'9') if(c=='-') sign=-1;
 8     int ret=c-'0';
 9     while((c=getchar())>='0'&&c<='9') ret=ret*10+c-'0';
10     return ret*sign;
11 }
12 vector<int>g[maxn];
13 int n,root;
14 int h[maxn];
15 int fa[maxn];
16 int f[maxn][2];
17 void dp(int);
18 int main()
19 {
20     n=read();
21     for(int i=1;i<=n;i++)
22     {
23         h[i]=read();
24     }
25     for(int i=1;i<=n-1;i++)
26     {
27         int x,y;
28         x=read();
29         y=read();
30         g[y].push_back(x);
31         fa[x]=y;
32     }
33     for(int i=1;i<=n;i++)
34     {
35         if(!fa[i])
36         {
37             root=i;
38             break;
39         }
40     }
41     dp(root);
42     int ans;
43     ans=max(f[root][0],f[root][1]);
44     printf("%d",ans);
45     return 0;
46 }
47 void dp(int x)
48 {
49     f[x][0]=0;
50     f[x][1]=h[x];
51     for(int i=0;i<g[x].size();i++)
52     {
53         int v=g[x][i];
54         dp(v);
55         f[x][0]+=max(f[v][0],f[v][1]);
56         f[x][1]+=f[v][0];
57     }
58 }
View Code

 

posted @ 2020-09-01 15:55  lvwenhao20041015  阅读(41)  评论(0)    收藏  举报