POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加。

要求:

1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点)都不能被邀请

2.每一个员工都有一个兴奋值,在满足1的条件下,要使得邀请来的员工的兴奋值最高

输出最高的兴奋值。

简单的树形DP

dp[i][1]:表示以i为根的子树,邀请节点i的最大兴奋值

dp[i][0]:表示以i为根的子树,不邀请节点i的最大兴奋值

先根据入度找出整棵树的根节点,

然后一次DFS即可。

poj提交代码:

 1 #include<cstdio>
 2 #include<cstring>
 3
 4 using namespace std;
 5
 6 const int maxn=6005;
 7 const int inf=0x3f3f3f3f;
 8
 9 inline int max(int x,int y)
10 {
11     return x>y?x:y;
12 }
13
14 int dp[maxn][2];
15 int in[maxn];
16 int rate[maxn];
17 struct Edge
18 {
19     int to,next;
20 };
21 Edge edge[maxn];
22 int head[maxn];
23 int tot;
24
25 void init()
26 {
27     memset(head,-1,sizeof head);
28     tot=0;
29     memset(in,0,sizeof in);
30 }
31
32 void addedge(int u,int v)
33 {
34     edge[tot].to=v;
35     edge[tot].next=head[u];
36     head[u]=tot++;
37 }
38
39 void dfs(int u,int pre);
40
41 int main()
42 {
43     int n;
44     while(~scanf("%d",&n))
45     {
46         init();
47         scanf("%d",&rate[1]);
48         if(!n&&!rate[1])
49             break;
50         for(int i=2;i<=n;i++)
51         {
52             scanf("%d",&rate[i]);
53         }
54         for(int i=1;i<n;i++)
55         {
56             int u,v;
57             scanf("%d%d",&v,&u);
58             addedge(u,v);
59             in[v]++;
60         }
61         int root;
62         for(int i=1;i<=n;i++)
63         {
64             if(!in[i])
65             {
66                 root=i;
67                 break;
68             }
69         }
70         dfs(root,-1);
71         printf("%d\n",max(dp[root][0],dp[root][1]));
72     }
73     return 0;
74 }
75
76 void dfs(int u,int pre)
77 {
78     dp[u][1]=rate[u];
79     dp[u][0]=0;
80     for(int i=head[u];~i;i=edge[i].next)
81     {
82         int v=edge[i].to;
83         if(v==pre)
84             continue;
85         dfs(v,u);
86         dp[u][1]+=dp[v][0];
87         dp[u][0]+=max(dp[v][1],dp[v][0]);
88     }
89 }

HDU的1520和POJ的2342是一样的,但是输入有点不同

hdu提交代码:

 1 #include<cstdio>
 2 #include<cstring>
 3
 4 using namespace std;
 5
 6 const int maxn=6005;
 7 const int inf=0x3f3f3f3f;
 8
 9 inline int max(int x,int y)
10 {
11     return x>y?x:y;
12 }
13
14 int dp[maxn][2];
15 int in[maxn];
16 int rate[maxn];
17 struct Edge
18 {
19     int to,next;
20 };
21 Edge edge[maxn];
22 int head[maxn];
23 int tot;
24
25 void init()
26 {
27     memset(head,-1,sizeof head);
28     tot=0;
29     memset(in,0,sizeof in);
30 }
31
32 void addedge(int u,int v)
33 {
34     edge[tot].to=v;
35     edge[tot].next=head[u];
36     head[u]=tot++;
37 }
38
39 void dfs(int u,int pre);
40
41 int main()
42 {
43     int n;
44     while(~scanf("%d",&n))
45     {
46         init();
47         for(int i=1;i<=n;i++)
48         {
49             scanf("%d",&rate[i]);
50         }
51         while(true)
52         {
53             int u,v;
54             scanf("%d%d",&v,&u);
55             if(!u&&!v)
56                 break;
57             addedge(u,v);
58             in[v]++;
59         }
60         int root;
61         for(int i=1;i<=n;i++)
62         {
63             if(!in[i])
64             {
65                 root=i;
66                 break;
67             }
68         }
69         dfs(root,-1);
70         printf("%d\n",max(dp[root][0],dp[root][1]));
71     }
72     return 0;
73 }
74
75 void dfs(int u,int pre)
76 {
77     dp[u][1]=rate[u];
78     dp[u][0]=0;
79     for(int i=head[u];~i;i=edge[i].next)
80     {
81         int v=edge[i].to;
82         if(v==pre)
83             continue;
84         dfs(v,u);
85         dp[u][1]+=dp[v][0];
86         dp[u][0]+=max(dp[v][1],dp[v][0]);
87     }
88 }

时间: 2024-12-16 08:51:34

POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题的相关文章

HDU 1520 Anniversary party 树DP水题

非常水的树DP,状态为当前为i,上级来没来 然后跑一遍记忆化搜索即可 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib>

URAL 1039 Anniversary Party 树形DP 水题

1039. Anniversary Party Time limit: 0.5 secondMemory limit: 8 MB Background The president of the Ural State University is going to make an 80'th Anniversary party. The university has a hierarchical structure of employees; that is, the supervisor rela

HDU 1520 Anniversary party (树形DP)

树形DP的关键在于如何处理递归返回的信息.这题dp[i][0]表示不选i点时当前最高权值.dp[i][1]表示选i点时当前最高权值.状态转移方程:dp[u][[0]+=max(dp[v][0],dp[v][1]),dp[u][1]+=dp[v][0]; 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm&

洛谷P1352 没有上司的舞会(树形DP水题)

题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了.所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数. 输入输出格式 输入格式: 第一行一个整数N.(1<=N<=6000) 接下来N行,第i+1行表示i号职员的快乐指数Ri.(-128<=Ri

树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]

题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 再考虑状态转移 dp[u]=MAX(dp[to]+1,siz+dp[to]);siz为枚举子树到以to为节点的子树时之前已遍历的总时间 很明显这个转移过来的dp值的最优化依赖于子树遍历的顺序 所以我们需要找到一种最优的子树遍历顺序来使每个子树得到最优的dp值来更新 我们通过观察可以发现 交换任意两

poj 2342 &amp;&amp; hdu 1520 树形dp

题意:有n个人,接下来n行是n个人的价值,再接下来n行给出l,k说的是l的上司是k,这里注意l与k是不能同时出现的 链接:点我 dp[i][1] += dp[j][0], dp[i][0] += max{dp[j][0],dp[j][1]};其中j为i的孩子节点. 第二次做感觉已经很水了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #i

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

hdu oj 1520 Anniversary party(树形dp入门)

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