POJ 2342 - Anniversary party

树形DP的水题。

状态转移方程:

设dp[i][0]为第i号人不去的情况下,以其为根的子树,最大的rating和;dp[i][1]为第i号人去的情况下,以其为根的子树,最大的rating和;

对于树上的每条边:edge[u][ (v[1]) ]……edge[u][ (v[k]) ]……,都有:

  dp[u][0]+=∑ max( dp[ (v[k]) ][1] , dp[ (v[k]) ][0] )

  dp[u][1]+=∑ dp[ (v[k]) ][0]

将每个人的dp[i][1]按照输入初始化后,用vector记录下一个点的所有孩子,并且找到root,最后进行DFS即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<algorithm>
 5 #define MAXN 6005
 6 using namespace std;
 7 int n,fl[MAXN],dp[MAXN][2],root;
 8 vector<int> child[MAXN];
 9 void dfs(int now)
10 {
11     int next;
12     for(int i=0;i<child[now].size();i++)
13     {
14         next=child[now][i];
15         dfs(next);
16         dp[now][0]+=max(dp[next][1],dp[next][0]);
17         dp[now][1]+=dp[next][0];
18     }
19 }
20 int main()
21 {
22     memset(fl,0,sizeof(fl));
23
24     scanf("%d%",&n);
25
26     for(int i=1;i<=n;i++) scanf("%d",&dp[i][1]);
27     for(int i=1;i<=n;i++)
28     {
29         int L,K;
30         scanf("%d%d",&L,&K);
31         child[K].push_back(L);
32         fl[L]=1;
33     }
34     for(int i=1;i<=n;i++) if(fl[i]==0){root=i;break;}
35
36     dfs(root);
37     printf("%d\n",max(dp[root][0],dp[root][1]));
38 }
时间: 2024-11-10 08:15:32

POJ 2342 - Anniversary party的相关文章

poj 2342 Anniversary party,树形DP easy

poj 2342 Anniversary party 没有上司的晚会 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会,要求与会职员的快乐指数最大.但是,没有职员愿和直接上司一起与会. 程序名:party 输入格式: 第一行一个整数N.(1<=N<=6000) 接下来N行,第i+1行表示i号职员的快乐指数Ri.(-128<=Ri<=127) 接下来N-1行,每行输入

POJ 2342 Anniversary party (树形dp 入门题)

Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4810   Accepted: 2724 Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure

POJ 2342 Anniversary party(基础的树形dp)

题目 http://poj.org/problem?id=2342 大致意思就是 输入n个结点,接下去的n行,表示1-n的每个结点分别具有的活跃值,在接下来去的n-1行,输入a,b,表示b是a的上司 输出由于直接有上司和下属关系的两个人不能同时参加party, 求出能让party活跃值最大的方案(求出最大的活跃值即可). 思路 每个结点有两种状态,参加和不参加,用0表示不参加,1表示参加 dp[i][1]表示第i个参与者参加了,dp[i][0]表示第i个参与者没有参加. 状态转移方程:dp[u]

POJ 2342 Anniversary party (树dp)

题目链接:http://poj.org/problem?id=2342 有n个人,每个人有活跃值.下面n-1行u和v表示u的上司是v,有直接上司和下属的关系不能同时参加party,问你party最大的活跃值是多少. 也就是说一棵树中,选择的点不能是相邻的点,且要使活跃值最大. 简单的树形dp,任意选一个点开始遍历,从叶子节点开始回溯. dp[i][0]表示不选i节点最大的活跃度,则dp[i][1]表示选i节点最大的活跃度. i与j相连,dp[i][0] += max(dp[j][0], dp[j

POJ 2342 Anniversary party 树形dp入门

http://poj.org/problem?id=2342 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总活跃指数最大. 对于每一个人,都有两种情况,选,或者不选.然后选了后,他的下属就只能不选了,如果它不选,下属可能选或者不选. 这样用dfs + 记忆化搜索,就好了 每次搜索,就是要求以第cur个节点为根的子树中,其中第cur个节点的状态是s

POJ 2342 Anniversary party 树形DP基础题

题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人就不可以邀请其的直属员工, 问如何使得这个快乐值达到最大. 题解:对每个结点dp[i][0]表示不邀请这个员工,其子树达到的最大快乐值,dp[i][1]表示邀请i员工其子树达到的最大值. dp[i][0]=(i的全部员工的max(dp[u][1],dp[u][0)相加,也就是其子员工来或不来的最大快

POJ 2342 Anniversary party(树形dp)

Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7230   Accepted: 4162 Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure

[ACM] POJ 2342 Anniversary party (树形DP入门题)

Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4410   Accepted: 2496 Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure

HDU 1520 &amp; POJ 2342 Anniversary party(树形dp)

Anniversary party Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of em

POJ 2342 Anniversary Party ( 树形DP )

deque 的插入操作不一定有 vector 快 #include <iostream> #include <cstring> #include <fstream> #include <vector> using namespace std; #define NOT_SELECTED 0 #define SELECTED 1 #define SIZE 6001 vector< int > relations[SIZE]; bool visited