「POJ 2342」没有上司的晚会

没有上司的晚会

题目背景

poj2342

题目描述

Ural 大学有N 个职员,编号为 1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。

输入格式

第一行一个整数 N (1<=N<=6000)。
接下来 N 行,第i+1行表示i 号职员的快乐指数Ri(-128<=Ri<=127) 。
接下来 N-1 行,每行输入一对整数 L 和 K。表示 K 是 L 的直接上司
最后一行输入0 0。

输出格式

输出最大的快乐指数。

样例数据 1

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0

输出

1
5

分析

树形DP,注意边界。

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
using namespace std;
char ch;
bool signum;
inline void readInt(int& l) {
l = 0;
do
ch = cin.get();
while ((ch < '0' || ch > '9') && ch != '-' && ch != '0');
if (ch == '-') signum = true, ch = cin.get();
while (ch >= '0' && ch <= '9')
l = (l << 1) + (l << 3) + ch - '0', ch = cin.get();
if (signum) l = -l, ch = cin.get();
}
int father[6005], vis[6005], dp[6005][2], t;
void dfs(int node) {
vis[node] = 1;
for (register int i = 1; i <= t; i++) {
if (!vis[i] && father[i] == node) {
dfs(i);
dp[node][1] += dp[i][0];
dp[node][0] += max(dp[i][0], dp[i][1]);
}
}
}
int main() {
int l, k;
ios::sync_with_stdio(false);
cin.tie(NULL);
readInt(t);
for (register int i = 1; i <= t; i++) readInt(dp[i][1]);
int root = 0;
while (readInt(l), readInt(k), l + k > 0) {
father[l] = k;
root = k;
}
memset(vis, 0, sizeof(vis));
dfs(root);
cout << max(dp[root][1], dp[root][0]) << endl;
return 0;
}
#

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×