洛谷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 }