题目描述

小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题。于是当日课后,小明就向老师提出了这个问题:

一株奇怪的花卉,上面共连有NN N朵花,共有N−1N-1N−1条枝干将花儿连在一起,并且未修剪时每朵花都不是孤立的。每朵花都有一个“美丽指数”,该数越大说明这朵花越漂亮,也有“美丽指数”为负数的,说明这朵花看着都让人恶心。所谓“修剪”,意为:去掉其中的一条枝条,这样一株花就成了两株,扔掉其中一株。经过一系列“修剪“之后,还剩下最后一株花(也可能是一朵)。老师的任务就是:通过一系列“修剪”(也可以什么“修剪”都不进行),使剩下的那株(那朵)花卉上所有花朵的“美丽指数”之和最大。

老师想了一会儿,给出了正解。小明见问题被轻易攻破,相当不爽,于是又拿来问你。

输入输出格式

输入格式:

第一行一个整数N(1≤N≤16000)N(1 ≤ N ≤ 16000)N(1≤N≤16000)。表示原始的那株花卉上共NN N朵花。

第二行有NN N个整数,第III个整数表示第III朵花的美丽指数。

接下来N−1N-1N−1行每行两个整数a,ba,ba,b,表示存在一条连接第aaa 朵花和第bbb朵花的枝条。

输出格式:

一个数,表示一系列“修剪”之后所能得到的“美丽指数”之和的最大值。保证绝对值不超过214748364721474836472147483647。

输入输出样例

输入样例#1:
复制

  1. 7
  2. -1 -1 -1 1 1 1 0
  3. 1 4
  4. 2 5
  5. 3 6
  6. 4 7
  7. 5 7
  8. 6 7
输出样例#1: 复制

  1. 3

说明

【数据规模与约定】

对于60%60\%60%的数据,有N≤1000N≤1000N≤1000;

对于100%100\%100%的数据,有N≤16000N≤16000N≤16000。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<string>
  7. #include<cmath>
  8. #include<map>
  9. #include<set>
  10. #include<vector>
  11. #include<queue>
  12. #include<bitset>
  13. #include<ctime>
  14. #include<time.h>
  15. #include<deque>
  16. #include<stack>
  17. #include<functional>
  18. #include<sstream>
  19. //#include<cctype>
  20. //#pragma GCC optimize(2)
  21. using namespace std;
  22. #define maxn 200005
  23. #define inf 0x7fffffff
  24. //#define INF 1e18
  25. #define rdint(x) scanf("%d",&x)
  26. #define rdllt(x) scanf("%lld",&x)
  27. #define rdult(x) scanf("%lu",&x)
  28. #define rdlf(x) scanf("%lf",&x)
  29. #define rdstr(x) scanf("%s",x)
  30. #define mclr(x,a) memset((x),a,sizeof(x))
  31. typedef long long ll;
  32. typedef unsigned long long ull;
  33. typedef unsigned int U;
  34. #define ms(x) memset((x),0,sizeof(x))
  35. const long long int mod = 98765431;
  36. #define Mod 1000000000
  37. #define sq(x) (x)*(x)
  38. #define eps 1e-5
  39. typedef pair<int, int> pii;
  40. #define pi acos(-1.0)
  41. //const int N = 1005;
  42. #define REP(i,n) for(int i=0;i<(n);i++)
  43. typedef pair<int, int> pii;
  44.  
  45. inline int rd() {
  46. int x = 0;
  47. char c = getchar();
  48. bool f = false;
  49. while (!isdigit(c)) {
  50. if (c == '-') f = true;
  51. c = getchar();
  52. }
  53. while (isdigit(c)) {
  54. x = (x << 1) + (x << 3) + (c ^ 48);
  55. c = getchar();
  56. }
  57. return f ? -x : x;
  58. }
  59.  
  60. ll gcd(ll a, ll b) {
  61. return b == 0 ? a : gcd(b, a%b);
  62. }
  63. int sqr(int x) { return x * x; }
  64.  
  65. /*ll ans;
  66. ll exgcd(ll a, ll b, ll &x, ll &y) {
  67. if (!b) {
  68. x = 1; y = 0; return a;
  69. }
  70. ans = exgcd(b, a%b, x, y);
  71. ll t = x; x = y; y = t - a / b * y;
  72. return ans;
  73. }
  74. */
  75.  
  76. int n;
  77. int val[maxn];
  78. int head[maxn], tot;
  79. struct node {
  80. int u, v, nxt;
  81. }e[maxn<<1];
  82. int dp[maxn];
  83. int ans = -inf;
  84. void addedge(int u, int v) {
  85. e[++tot].u = u; e[tot].v = v; e[tot].nxt = head[u];
  86. head[u] = tot;
  87. }
  88.  
  89. void dfs(int u, int fa) {
  90. dp[u] = val[u];
  91. for (int i = head[u]; i; i = e[i].nxt) {
  92. int v = e[i].v;
  93. if (v == fa)continue;
  94. dfs(v, u);
  95. dp[u] += max(0, dp[v]);
  96. }
  97. ans = max(ans, dp[u]);
  98. return;
  99. }
  100.  
  101. int main()
  102. {
  103. // ios::sync_with_stdio(0);
  104. n = rd();
  105. for (int i = 1; i <= n; i++)val[i] = rd();
  106. for (int i = 1; i < n; i++) {
  107. int u = rd(), v = rd();
  108. addedge(u, v); addedge(v, u);
  109. }
  110. dfs(1, 0);
  111. printf("%d\n", ans);
  112. return 0;
  113. }

最大子树和 树形dp的更多相关文章

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

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

  2. 洛谷P1122 最大子树和 树形DP初步

    小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明就向老师提 ...

  3. P1122 最大子树和 (树形DP)

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  4. HDU 1561 树形DP入门

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. BZOJ 4987 (树形DP)

    ###题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4987 ###分析 先考虑贪心,显然k个节点形成一棵树 求出树的直径,显然直径应该只被经 ...

  6. 【树形DP】洛谷1122_最大子树和

    又是一道树形DP的入门题,思想非常简单  然而我最开始还是存了两个状态[传送门] 题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上 ...

  7. [Luogu P1122]最大子树和 (简单树形DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P1122 Solution 这是一道简单的树形DP题. 首先,我们可以转换一下题面,可以发现,题目要求我们求 ...

  8. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  9. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

随机推荐

  1. DataGridView根据条件给单元格绑定图片

    代码区: private void Form1_Load(object sender, EventArgs e) { myClass.mySqliteAPI conn = new myClass.my ...

  2. HBase 官方文档中文版

    地址链接: http://abloz.com/hbase/book.html 里面包含基本的API和使用说明

  3. python实现文件下载的方法总结

    前端时间遇到一个通过url下载文件的需求,只需要简单的编写一个py脚本即可.从网上搜了下python实现文件下载的方法,总结如下,备查. 以下方法均已测试,环境win8.1  python2.6/2. ...

  4. Spring总结三:DI(依赖注入)

    简介: 所谓的依赖注入,其实是当一个bean实例引用到了另外一个bean实例时spring容器帮助我们创建依赖bean实例并注入(传递)到另一个bean中,比如你使用Spring容器创建的对象A里面需 ...

  5. SSH隧道技术简介

    本文的受众如果你遇到了以下问题,那么你应该阅读这篇文章 我听说过这种技术,我对它很感兴趣 我想在家里访问我在公司的机器(写程序,查数据,下电影). 公司为了防止我们用XX软件封锁了它的端口或者服务器地 ...

  6. 566. Reshape the Matrix矩阵重排

    [抄题]: In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a ...

  7. Java 基于quartz实现定时 之一(注解方式配置)

    需要在项目里,导入quartz.jar package cn.zr.pringmvctest.trigger; import org.springframework.context.annotatio ...

  8. opennebula 安装指定参数

    [root@opennebula opennebula-]# ./install.sh -u oneadmin -g oneadmin -k -d /home/oneadmin/ -u 指定用户-g ...

  9. solr第一天 基础增删改查操作

    全文检索技术   Lucene&Solr               Part2 1 课程计划 1.索引库的维护 a) 添加文档 b) 删除文档 c) 修改文档 2.Lucene的查询 a)  ...

  10. Web服务器父与子 Apache和Tomcat区别(转)

    From http://developer.51cto.com/art/201007/210894.htm 熟悉三国的朋友都知道曹操,曹操有二十五个儿子,其中最得曹操宠爱的是曹丕.曹植.曹彰三个,曹丕 ...