题意:

某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总活跃指数最大。

解题思路:

任何一个点的取舍可以看作一种决策,那么状态就是在某个点取的时候或者不取的时候,以他为根的子树能有的最大活跃总值。分别可以用f[i,1]和f[i,0]表示第i个人来和不来。

当i来的时候,dp[i][1] += dp[j][0];//j为i的下属

当i不来的时候,dp[i][0] +=max(dp[j][1],dp[j][0]);//j为i的下属

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 employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyakov. In order to make the party funny for every one, the rector does not want both an employee and his or her immediate supervisor to be present. The personnel office has evaluated conviviality of each employee, so everyone has some number (rating) attached to him or her. Your task is to make a list of guests with the maximal possible sum of guests’ conviviality ratings.

Input

Employees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go N – 1 lines that describe a supervisor relation tree. Each line of the tree specification has the form:

L K

It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line

0 0

Output

Output should contain the maximal sum of guests’ ratings.

Sample Input

7

1

1

1

1

1

1

1

1 3

2 3

6 4

7 4

4 5

3 5

0 0

Sample Output

5

  1. #include<map>
  2. #include<set>
  3. #include<queue>
  4. #include<stack>
  5. #include<vector>
  6. #include<math.h>
  7. #include<cstdio>
  8. #include<sstream>
  9. #include<numeric>//STL数值算法头文件
  10. #include<stdlib.h>
  11. #include <ctype.h>
  12. #include<string.h>
  13. #include<iostream>
  14. #include<algorithm>
  15. #include<functional>//模板类头文件
  16. using namespace std;
  17. typedef long long ll;
  18. const int maxn=6005;
  19. const int INF=0x3f3f3f3f;
  20. //先建树,找到根节点,然后开始dfs
  21. int n,m,x,y;
  22. int dp[maxn][2],vis[maxn],father[maxn];//dp[i][1]表示来,dp[i][0]表示不来
  23. void dfs(int node)
  24. {
  25. int i,j;
  26. vis[node]=1;
  27. for(i=1; i<=n; i++)
  28. {
  29. if(!vis[i]&&father[i]==node)
  30. {
  31. dfs(i);//从根节点的儿子节点开始递归
  32. dp[node][1]+=dp[i][0];//上司来
  33. dp[node][0]+=max(dp[i][1],dp[i][0]);//上司不来,然后看下属来还是不来
  34. }
  35. }
  36. }
  37. int main()
  38. {
  39. while(~scanf("%d",&n))
  40. {
  41. int i,j;
  42. memset(father,0,sizeof(father));
  43. memset(dp,0,sizeof(dp));
  44. memset(vis,0,sizeof(vis));
  45. for(i=1; i<=n; i++)
  46. scanf("%d",&dp[i][1]);
  47. int root=0;
  48. //bool flag=1;
  49. while(~scanf("%d %d",&x,&y)&&(x!=0||y!=0))
  50. {
  51. father[x]=y;
  52. //if(root==x||flag)
  53. //root=y;
  54. }
  55. root=y;
  56. while(father[root])
  57. root=father[root];//找根节点
  58. dfs(root);
  59. int maxx=max(dp[root][1],dp[root][0]);
  60. printf("%d\n",maxx);
  61. }
  62. return 0;
  63. }

  1. //更快的一种方法
  2. #include<map>
  3. #include<set>
  4. #include<queue>
  5. #include<stack>
  6. #include<vector>
  7. #include<math.h>
  8. #include<cstdio>
  9. #include<sstream>
  10. #include<numeric>//STL数值算法头文件
  11. #include<stdlib.h>
  12. #include <ctype.h>
  13. #include<string.h>
  14. #include<iostream>
  15. #include<algorithm>
  16. #include<functional>//模板类头文件
  17. using namespace std;
  18. //typedef long long ll;
  19. //const int maxn=6005;
  20. //const int INF=0x3f3f3f3f;
  21. struct node
  22. {
  23. int child,father,brother,present,not_present;
  24. int max()//结构体内的函数调用时耗时少
  25. {
  26. return present>not_present?present:not_present;
  27. }
  28. void init()
  29. {
  30. child=father=brother=not_present=0;
  31. }
  32. } tree[6005];
  33. void dfs(int root)
  34. {
  35. int son = tree[root].child;
  36. while(son)
  37. {
  38. dfs(son);
  39. tree[root].present+=tree[son].not_present;
  40. tree[root].not_present+=tree[son].max();
  41. son = tree[son].brother;
  42. }
  43. }
  44. int main()
  45. {
  46. int n,i,j,k,l;
  47. while(~scanf("%d",&n)&&n)
  48. {
  49. for(i = 1; i<=n; i++)
  50. {
  51. scanf("%d",&tree[i].present);
  52. tree[i].init();
  53. }
  54. while(~scanf("%d%d",&l,&k),l+k)
  55. {
  56. tree[l].father = k;
  57. tree[l].brother = tree[k].child;
  58. tree[k].child = l;
  59. }
  60. for(i = 1; i<=n; i++)
  61. {
  62. if(!tree[i].father)
  63. {
  64. dfs(i);
  65. printf("%d\n",tree[i].max());
  66. break;
  67. }
  68. }
  69. }
  70. return 0;
  71. }

树形dp入门(poj 2342 Anniversary party)的更多相关文章

  1. DP Intro - poj 2342 Anniversary party

    今天开始做老师给的专辑,打开DP专辑 A题 Rebuilding Roads 直接不会了,发现是树形DP,百度了下了该题,看了老半天看不懂,想死的冲动都有了~~~~ 最后百度了下,树形DP入门,找到了 ...

  2. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  3. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  4. [poj2342]Anniversary party树形dp入门

    题意:选出不含直接上下司关系的最大价值. 解题关键:树形dp入门题,注意怎么找出根节点,运用了并查集的思想. 转移方程:dp[i][1]+=dp[j][0];/i是j的子树 dp[i][0]+=max ...

  5. POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划)

    POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划) Descri ...

  6. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

  7. 树形DP入门详解+题目推荐

    树形DP.这是个什么东西?为什么叫这个名字?跟其他DP有什么区别? 相信很多初学者在刚刚接触一种新思想的时候都会有这种问题. 没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上. 既 ...

  8. LuoGu-P1122 最大子树和+树形dp入门

    传送门 题意:在一个树上,每个加点都有一个值,求最大的子树和. 思路:据说是树形dp入门. 用dfs,跑一边,回溯的时候求和,若和为负数,则减掉,下次不记录这个节点. #include <ios ...

  9. POJ 2342 - Anniversary party - [树形DP]

    题目链接:http://poj.org/problem?id=2342 Description There is going to be a party to celebrate the 80-th ...

  10. poj 2342 Anniversary party 简单树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3862   Accepted: 2171 ...

随机推荐

  1. truncate与delete以及drop

    truncate:删除整个表,但不删除定义(删除了整个表的数据,但表结构还在) drop:删除整个表,表数据和表结构都删除了 delete:删除表中数据 比较delete和drop 1.truncat ...

  2. SpringBoot 在CentOS7部署,注册为服务,开机启动

    1.首先在maven工程的pom文件中引入以下标签并保存 <build> <plugins> <plugin> <groupId>org.springf ...

  3. Codeforces 321E Ciel and Gondolas

    传送门:http://codeforces.com/problemset/problem/321/E [题解] 首先有一个$O(n^2k)$的dp. # include <stdio.h> ...

  4. jquery的基础语法、选取元素、操作元素、加事件、挂事件及移除事件

    jquery基础知识 1.jquery文件的引入,所有的js代码要写在下面那段代码下面. <script src="../jquery-1.11.2.min.js">& ...

  5. Deep learning with Theano 官方中文教程(翻译)(三)——多层感知机(MLP)

    关于更多的http://deeplearning.net/tutorial/的翻译还有学习笔记会陆续整理传到博客. 供大家相互交流和学习,本人水平有限,若有各种大小错误,还请巨牛大牛小牛微牛们立马拍砖 ...

  6. VMware Workstation Pro 14 序列号

    VMware Workstation Pro 14 序列号: AA702-81D8N-0817Y-75PQT-Q70A4 YC592-8VF55-M81AZ-FWW5T-WVRV0 FC78K-FKE ...

  7. 特征工程(Feature Engineering)

    一.什么是特征工程? "Feature engineering is the process of transforming raw data into features that bett ...

  8. Perl6 Bailador框架(6):获取用户输入

    use v6; use Bailador; get '/' => sub { ' <html> <head><title></title>< ...

  9. android隐藏EditText光标

    在android中如果有EditText,那么在载入时,光标会默认显示在第一个EditText框中,如果不想显示光标,且也不想把该光标移动到下一个EditText框,最简单的方法是在该 EditTex ...

  10. Linux内核堆栈使用方法 进程0和进程1【转】

    转自:http://blog.csdn.net/yihaolovem/article/details/37119971 目录(?)[-] 8 Linux 系统中堆栈的使用方法 81  初始化阶段 82 ...