标签:seq employees super intern order 题意 cstring person cal
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7230 | Accepted: 4162 |
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
5
题意:某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加挽回的人都不希望见到自己的直接上司。现在已知每个人的活跃指数和上司关系(不存在环),求晚会的活跃指数的最大值。
思路:dp[x][0]表示x去参加晚会,dp[x][1]表示x不去参加晚会。那么有以下两种情况:
/* dp[x][0]:x 不去参加聚会 dp[x][1]:x 去参加聚会 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 6005; int tot = 0,fa[maxn],head[maxn],dp[maxn][2];; struct Tree{ int fa,son; int next; Tree():fa(0),son(0),next(0){} }tree[maxn]; void addedge(int u,int v) { tree[tot].son = v; tree[tot].next = head[u]; head[u] = tot++; } void dfs(int cur) { for (int i = head[cur];i != -1;i = tree[i].next) { dfs(tree[i].son); dp[cur][1] += dp[tree[i].son][0]; dp[cur][0] += max(dp[tree[i].son][0],dp[tree[i].son][1]); } } int main() { int N; while (~scanf("%d",&N)) { memset(head,-1,sizeof(head)); memset(dp,0,sizeof(dp)); for (int i = 1;i <= N;i++) scanf("%d",&dp[i][1]); int L,K; while (scanf("%d%d",&L,&K) && L && K) { tree[L].fa = K; addedge(K,L); } int root = 1; while (tree[root].fa) root = tree[root].fa; dfs(root); printf("%d\n",max(dp[root][0],dp[root][1])); } return 0; }
POJ 2342 Anniversary party(树形dp)
标签:seq employees super intern order 题意 cstring person cal
原文地址:http://www.cnblogs.com/zzy19961112/p/6007131.html