题目描述 Description

Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。

输入描述 Input Description

第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。

输出描述 Output Description

输出最大的快乐指数。

样例输入 Sample Input
  1.  
样例输出 Sample Output
数据范围及提示 Data Size & Hint

各个测试点1s


  按照这个关系建一棵树,然后进行树归,用f[i]表示i职员参加舞会的最大快乐指数之和,g[i]表示i职员不参加舞会的最大快乐指数之和。那么有f[i]为所有i的子节点的g[son[i]]的和,g[i]是i的子节点的g[son[i]]和f[son[i]]最大值的和。

  最后的答案在f[1]和g[1]中找最大值。

Code

  1. /**
  2. * codevs
  3. * Problem#1380
  4. * Accepted
  5. * Time:10ms
  6. * Memory:492k
  7. */
  8. #include<iostream>
  9. #include<sstream>
  10. #include<algorithm>
  11. #include<cstdio>
  12. #include<cstring>
  13. #include<cstdlib>
  14. #include<cctype>
  15. #include<cmath>
  16. #include<ctime>
  17. #include<map>
  18. #include<stack>
  19. #include<set>
  20. #include<queue>
  21. #include<vector>
  22. #ifndef WIN32
  23. #define AUTO "%lld"
  24. #else
  25. #define AUTO "%I64d"
  26. #endif
  27. using namespace std;
  28. typedef bool boolean;
  29. #define inf 0xfffffff
  30. #define smin(a, b) (a) = min((a), (b))
  31. #define smax(a, b) (a) = max((a), (b))
  32. template<typename T>
  33. inline boolean readInteger(T& u) {
  34. char x;
  35. int aFlag = ;
  36. while(!isdigit((x = getchar())) && x != '-' && x != -);
  37. if(x == -) {
  38. ungetc(x, stdin);
  39. return false;
  40. }
  41. if(x == '-') {
  42. aFlag = -;
  43. x = getchar();
  44. }
  45. for(u = x - ''; isdigit((x = getchar())); u = u * + x - '');
  46. u *= aFlag;
  47. ungetc(x, stdin);
  48. return true;
  49. }
  50.  
  51. typedef class Edge {
  52. public:
  53. int end;
  54. int next;
  55. Edge(const int end = , const int next = ):end(end), next(next) { }
  56. }Edge;
  57.  
  58. typedef class MapManager {
  59. public:
  60. int ce;
  61. int *h;
  62. Edge *edge;
  63. MapManager():ce(), h(NULL), edge(NULL) { }
  64. MapManager(int points, int edges):ce() {
  65. h = new int[(const int)(points + )];
  66. edge = new Edge[(const int)(edges + )];
  67. memset(h, , sizeof(int) * (points + ));
  68. }
  69.  
  70. inline void addEdge(int from, int end) {
  71. edge[++ce] = Edge(end, h[from]);
  72. h[from] = ce;
  73. }
  74.  
  75. Edge& operator [](int pos) {
  76. return edge[pos];
  77. }
  78. }MapManager;
  79. #define m_begin(g, i) (g).h[(i)]
  80.  
  81. int n;
  82. int *val;
  83. MapManager g;
  84. int *f, *g1;
  85. int root;
  86.  
  87. inline void init() {
  88. readInteger(n);
  89. val = new int[(const int)(n + )];
  90. g = MapManager(n, n);
  91. f = new int[(const int)(n + )];
  92. g1 = new int[(const int)(n + )];
  93. for(int i = ; i <= n; i++)
  94. readInteger(val[i]);
  95. int sum = ;
  96. for(int i = , a, b; i < n; i++) {
  97. readInteger(a);
  98. readInteger(b);
  99. sum += a;
  100. g.addEdge(b, a);
  101. }
  102. root = n * (n + ) / - sum;
  103. }
  104.  
  105. void treedp(int node, int fa) {
  106. g1[node] = ;
  107. f[node] = val[node];
  108. for(int i = m_begin(g, node); i != ; i = g[i].next) {
  109. int& e = g[i].end;
  110. if(e == fa) continue;
  111. treedp(e, node);
  112. g1[node] += max(g1[e], f[e]);
  113. f[node] += g1[e];
  114. }
  115. }
  116.  
  117. inline void solve() {
  118. treedp(root, );
  119. printf("%d", max(g1[root], f[root]));
  120. }
  121.  
  122. int main() {
  123. init();
  124. solve();
  125. return ;
  126. }

codevs 1380 没有上司的舞会 - 树形动态规划的更多相关文章

  1. wikioi 1380 没有上司的舞会 树形dp

    1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他 ...

  2. Codevs 1380 没有上司的舞会

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就 ...

  3. 树形DP--codevs 1380 没有上司的舞会

    codevs 1380 没有上司的舞会 变式题目:给定一棵树每个点有一个点权,求一个独立集使得点权和最大,树上的独立集指的是选取树上的点,使尽量多的点不直接相连  时间限制: 1 s  空间限制: 1 ...

  4. CodeVS1380 没有上司的舞会 [树形DP]

    题目传送门 没有上司的舞会 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个 ...

  5. 『没有上司的舞会 树形DP』

    树形DP入门 有些时候,我们需要在树形结构上进行动态规划来求解最优解. 例如,给定一颗\(N\)个节点的树(通常是无根树,即有\(N-1\)条无向边),我们可以选择任意节点作为根节点从而定义出每一颗子 ...

  6. 洛谷P1352 没有上司的舞会——树形DP

    第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...

  7. P1352 没有上司的舞会——树形DP入门

    P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...

  8. P1352 没有上司的舞会&&树形DP入门

    https://www.luogu.com.cn/problem/P1352 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的 ...

  9. [luogu]P1352 没有上司的舞会[树形DP]

    本Lowbee第一次写树形DP啊,弱...一个变量写错半天没看出来...... 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点 ...

随机推荐

  1. 【紫书】Tree UVA - 548 静态建树dfs

    题意:给你中序后序 求某叶子节点使得从根到该节点权值和最小.若存在多个,输出其权值最小的那个. 题解:先建树,然后暴力dfs/bfs所有路径,取min 技巧:递归传参数,l1,r1,l2,r2, su ...

  2. SAPI

    https://en.wikipedia.org/wiki/Server_Application_Programming_Interface In computing, Server Applicat ...

  3. the internal array pointer

    The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and ...

  4. HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  5. (转)Spring实现IoC的多种方式

    原文地址:http://www.cnblogs.com/best/p/5727935.html 目录 一.使用XML配置的方式实现IOC 二.使用Spring注解配置IOC 三.自动装配 四.零配置实 ...

  6. 洛谷P2444 病毒 [POI2000] AC自动机

    正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...

  7. html 1:1比例显示

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale= ...

  8. 自定义Metrics:让Prometheus监控你的应用程序

    前言 Prometheus社区提供了大量的官方以及第三方Exporters,可以满足Prometheus的采纳者快速实现对关键业务,以及基础设施的监控需求. 如上所示,一个简单的应用以及环境架构.一般 ...

  9. PHP导出excel时数字变为科学计数的解决方法

    在数据导出到excel时数字格式不对,一般分为以下两种情况. 1.excel单元格设置长度不够 解决方法: //在excel.php文件中 $objActSheet = $objPHPExcel-&g ...

  10. excel用法

    1:求大于某一值的个数:使用COUNTIF(区间,标准)    要大写 =COUNTIF(B2:B48,">=95") 2:求某一区间的个数用:大区间个数减小区间个数 =CO ...