标签: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