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][0] += max (dp[v][0], dp[v][1]) :表示上司没参加,其员工可以参加可以不参加

dp[u][1] += dp[v][0] : 表示若上司参加了,其员工一定不会参加

 1 #include <iostream>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 #define N 6006
 6 int e;
 7 int val[N],in[N],head[N],dp[N][2];
 8 struct node
 9 {
10     int v,next;
11 }pe[N];
12 void addedge(int u,int v)
13 {
14     pe[e].v = v;
15     pe[e].next = head[u];
16     head[u] = e++;
17 }
18 int dfs(int u)
19 {
20     dp[u][0] = 0;
21     dp[u][1] = val[u];
22     for(int i=head[u];i!=-1;i=pe[i].next)
23     {
24         int v = pe[i].v;
25         dfs(v);
26         dp[u][0] += max(dp[v][0],dp[v][1]);
27         dp[u][1] += dp[v][0];
28     }
29     return max(dp[u][0],dp[u][1]);
30 }
31 int main()
32 {
33     int n,v,u;
34     cin>>n;
35     memset(head,-1,sizeof(head));
36     e=0;
37     for(int i=1;i<=n;i++)
38     {
39         cin>>val[i];
40         in[i]=0;  //in 这个数组记录的是入度
41     }
42     while(cin>>v>>u && v+u!=0)
43     {
44         addedge(u,v);
45         in[v]++;
46     }
47     int ans=0;
48     for(int i=1;i<=n;i++)
49     {
50         if(!in[i])
51             ans+=dfs(i);
52     }
53     cout<<ans<<endl;
54     return 0;
55 }

时间: 2024-10-08 10:29:34

POJ 2342 Anniversary party(基础的树形dp)的相关文章

HDU 1520.Anniversary party 基础的树形dp

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12770    Accepted Submission(s): 5142 Problem Description There is going to be a party to celebrate the 80-th Anniversary of the

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行,每行输入

hdu 1520 Anniversary party 生日party 树形dp第一题

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8667    Accepted Submission(s): 3748 Problem Description There is going to be a party to celebrate the 80-th Anniversary of the

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 1655 and 3107 and 2378 树形dp(树的重心问题)

简单的树形dp,顺便学习了树的重心的概念,即以该点为根的树的最大子树的结点数最少. poj 1655: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 20001; 7 int head[N]; 8 int balance[N]; 9 int child[N]; 10 int n, e; 11 12 struct

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]按照输入初始化后

POJ 3398 / UVA 1218 Perfect Service 树形DP

树形DP Perfect Service Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1378   Accepted: 668 Description A network is composed of N computers connected by N ? 1 communication links such that any two computers can be communicated via a uniqu

hdu1520 Anniversary party(最大独立集 树形dp)

题目链接:点击打开链接 题目描述:现有一棵树,树上每个结点都有一个权值,问从中选一些点,这些点两两之间不直接连接,问权值最大为多少? 解题思路:很裸的一道树上最大独立集问题 树形dp即可 dp[i][0]:不选i节点 dp[i][0]+=max(dp[t][0],dp[t][1]); dp[i][1]:选i节点     dp[i][1]+=dp[t][0]; 代码: #pragma comment(linker,"/STACK:1024000000,1024000000") #incl

POJ 2057 The Lost House 经典树形DP+贪心

题意:链接 方法:树形DP+贪心 解析:这是一道好题. 好首先要明确这题求的是什么? 名义上是期望值,而实际上就是找一条路径.什么路径呢?从根节点走遍所有的叶子节点所花费步数最短的路径. 明确了题意后该怎么做呢? 首先看我们需要什么? 目前有个根节点,我们需要知道从他向一个分支走,失败步数是多少,成功步数是多少? 那么怎么维护我们需要的东西呢? 首先我们先给他们起个名:suc,fai; 其次再给一个节点的叶子节点的个数起个名:son 起名完事之后我们就要更新了. 先谈叶子节点,显然叶子节点的su