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

要求:

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=;
  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][];
  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,-,sizeof head);
  28. tot=;
  29. memset(in,,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[]);
  48. if(!n&&!rate[])
  49. break;
  50. for(int i=;i<=n;i++)
  51. {
  52. scanf("%d",&rate[i]);
  53. }
  54. for(int i=;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=;i<=n;i++)
  63. {
  64. if(!in[i])
  65. {
  66. root=i;
  67. break;
  68. }
  69. }
  70. dfs(root,-);
  71. printf("%d\n",max(dp[root][],dp[root][]));
  72. }
  73. return ;
  74. }
  75.  
  76. void dfs(int u,int pre)
  77. {
  78. dp[u][]=rate[u];
  79. dp[u][]=;
  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][]+=dp[v][];
  87. dp[u][]+=max(dp[v][],dp[v][]);
  88. }
  89. }

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

hdu提交代码:

  1. #include<cstdio>
  2. #include<cstring>
  3.  
  4. using namespace std;
  5.  
  6. const int maxn=;
  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][];
  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,-,sizeof head);
  28. tot=;
  29. memset(in,,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=;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=;i<=n;i++)
  62. {
  63. if(!in[i])
  64. {
  65. root=i;
  66. break;
  67. }
  68. }
  69. dfs(root,-);
  70. printf("%d\n",max(dp[root][],dp[root][]));
  71. }
  72. return ;
  73. }
  74.  
  75. void dfs(int u,int pre)
  76. {
  77. dp[u][]=rate[u];
  78. dp[u][]=;
  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][]+=dp[v][];
  86. dp[u][]+=max(dp[v][],dp[v][]);
  87. }
  88. }

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

  1. HDU 1520 Anniversary party [树形DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...

  2. poj 2342 hdu 1520【树形dp】

    poj 2342 给出每个顶点的happy值,还有若干组两个顶点L,K关系,表示K是L的上司.求当K.L不同时出现时获得的happy值的最大和. 设dp[u][0]表示不选u结点时获得的最大值,dp[ ...

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

    题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 ...

  4. poj 2342 && hdu 1520 树形dp

    题意:有n个人,接下来n行是n个人的价值,再接下来n行给出l,k说的是l的上司是k,这里注意l与k是不能同时出现的 链接:点我 dp[i][1] += dp[j][0], dp[i][0] += ma ...

  5. POJ 2342 Anniversary party 树形DP基础题

    题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...

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

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. 树形DP水题杂记

    BZOJ1131: [POI2008]Sta 题意:给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大. 题解:记录每个点的深度,再根据根节点的深度和逐层推导出其他点的深度和. ...

  8. 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 ...

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

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

随机推荐

  1. hdu3342 拓扑序

    题意:一个QQ群里面有一群大神,他们互相帮助解决问题,然后互相膜拜,于是有些人就称别人是他师父,现在给出很多师徒关系,问是否有矛盾 拓扑序,按师徒关系建边直接拓扑序就行了. #include<s ...

  2. 如何安装 VLFeat工具包到Linux (Ubuntu) 64_bit system matlab 中?

    最近要提一个数据集的feature,想先用HOG特征做一个baseline,听师兄说VLFeat 是一个不错的工具包,就下载了试试,刚刚配置成功,网上各种搜索教程啊 但是都不行,最后还是硬着头皮看官网 ...

  3. 小心对待query_cache_size

     作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 对于使用My ...

  4. OSGi 的由来和本质特性

    OSGi 的由来 随着科技和需求的发展和变化,现在的软件变得越来越庞大.这样,随之而来的最大挑战就是软件在设计上的越来越复杂和维护上的越来越困难.为了解决这个问题,软件架构师将软件切分成比较小的并且易 ...

  5. python_Day_02[数组、列表、元组之篇]

    一.对python中.pyc的理解 1).pyc文件可以理解为是python编译好的字节码文件,即只有python解释器才能读懂,类似于java中class文件 2)python运转过程: 当pyth ...

  6. JSP 相关试题(二)

    填空题 1.W3C是指___万维网联盟_______. 2.Internet采用的通信协议是___TCP/IP___. 3.当今比较流行的技术研发模式是__C/S__和__B/S__的体系结构来实现的 ...

  7. PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰

    有朋友下载了PHP5.3,PHP5.4版本想加载mysql支持的时候发现没有libmysql.dll文件,无法完成mysql配置,其实PHP5.3版本开始,使用mysqlnd库,不再使用libmysq ...

  8. python exec

    exec官方声明This statement supports dynamic execution of Python code. exec语句用来执行储存在字符串或文件中的python语句.exec ...

  9. Spring security与shiro

    shiro更轻量级,spring security过于复杂. Apache Shiro 使用手册(一)Shiro架构介绍 Spring Security笔记:Remember Me(下次自动登录)

  10. 异机恢复 RMAN-06023: no backup or copy of datafile 17 found to restore

    前不久因工作需要使用RMAN异机恢复,很基础也很具有代表性和普遍性,希望对需要的人有所帮助. 具体过程如下: 先拷贝原库的口令文件和参数文件到备库. 然后使用如下脚本对原库进行备份: run { al ...