5829: 没有上司的舞会 (树形DP入门)
5829: 没有上司的舞会 ![分享至QQ空间](http://www.tzcoder.cn/acmhome/forum/images/ico_qzone.gif)
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
总提交: 31 测试通过:22
View Code
总提交: 31 测试通过:22
描述
Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 H_i 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。
输入
第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数H_i。(-128<=H_i<=127)
接下来N-1行,每行输入一对整数L, K。表示K是L的直接上司。
最后一行输入0,0。
输出
输出最大的快乐指数。
样例输入
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
样例输出
5
题目来源
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n; 5 const int maxn=6005; 6 int arr[maxn]; 7 vector<int> G[maxn]; 8 int dp[maxn][2],in[maxn]; 9 10 void dfs(int ee){ 11 dp[ee][0]=0; 12 dp[ee][1]=arr[ee]; 13 for(int x:G[ee]){ 14 dfs(x); 15 dp[ee][0]+=max(dp[x][1],dp[x][0]); //有两种悬着 16 dp[ee][1]+=dp[x][0]; 17 } 18 } 19 20 int main() 21 { 22 ios::sync_with_stdio(false); 23 cin>>n; 24 for(int i=1;i<=n;i++) cin>>arr[i]; 25 for(int i=1,d1,d2;i<=n;i++){ 26 cin>>d1>>d2; 27 G[d2].push_back(d1); 28 in[d1]++; 29 } 30 int root; 31 for(int i=1;i<=n;i++){ 32 if(in[i]==0) {root=i;break;} //找入读为0的根 33 } 34 dfs(root); 35 cout << max(dp[root][0],dp[root][1]) << endl; 36 return 0; 37 }