题目描述

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

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

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

输入输出格式

输入格式:

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

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

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

输出格式:

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

输入输出样例

输入样例#1:

7
-1 -1 -1 1 1 1 0
1 4
2 5
3 6
4 7
5 7
6 7

输出样例#1:

3

思路:树形dp

实质是给一棵 n 个点的树,以 1 号点为根,求以每个点为根的子树大小,用 f[x] 表示以 x 为根且包含 x 的最大权联通块,则有状态转移方程:f[x]+=max(0,f[y]),其中 y 为 x 的儿子,由于儿子结点的美丽值可能小于 0,因此要与 0 逐个比较来判断是否选择

源代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 100000
#define MOD 16007
#define E 1e-6
#define LL long long
using namespace std;
struct Edge{int to;int next;
}edge[N];
int n;
int a[N];
int head[N],f[N];
int cnt,res;
void addEdge(int x,int y){edge[++cnt].to=y;edge[cnt].next=head[x];head[x]=cnt;
}
void treeDP(int x,int father){f[x]=a[x];for(int i=head[x];i;i=edge[i].next){int y=edge[i].to;if(y!=father){treeDP(y,x);f[x]+=max(0,f[y]);}}res=max(res,f[x]);
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<n;i++){int x,y;cin>>x>>y;addEdge(x,y);addEdge(y,x);}treeDP(1,0);printf("%d",res);return 0;
}

最大子树和(洛谷-P1122)相关推荐

  1. 洛谷 P1122 最大子树和 题解

    题目:P1122 最大子树和 DP - 树形DP - dfs 这题的做法被题目名字给暴露了 设 f [ i ] f[i] f[i] 为以点 i i i 为根的子树中的最大子树和 设 j j j 为 i ...

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

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

  3. 洛谷 P1122 最大子树和-求树的最大子树权值和

    输入: 7 -1 -1 -1 1 1 1 0 1 4 2 5 3 6 4 7 5 7 6 7 输出: 3 代码如下: #include <iostream> #include <ve ...

  4. 洛谷P1122最大子树和题解

    题目 一道比较好想的树形\(DP\) 完全可以用树形DP的基本思路,递归,然后取最优的方法. \(Code\) #include <iostream> #include <cstri ...

  5. 洛谷--橙色百道DP总结

    最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...

  6. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  7. 洛谷P3391文艺平衡树(Splay)

    题目传送门 转载自https://www.cnblogs.com/yousiki/p/6147455.html,转载请注明出处 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 ...

  8. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  9. [洛谷P1040] 加分二叉树

    洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...

最新文章

  1. python 字典
  2. python环境搭建需要装几个软件_python的发展前景及python环境搭建
  3. 【C语言】局部变量、全局变量,局部静态变量,全局静态变量,extern,static的区别...
  4. svg大小自适应_网格自适应的 2 种方法——实现更高效的计算
  5. 俄罗斯最大搜索引擎Yandex开源了一款梯度提升机器学习库CatBoost
  6. 第三天20160728
  7. The 2020 ICPC Asia Macau Regional Contest A. Accelerator(分治+NTT)
  8. 解决Dr.com上不了网的问题
  9. 响应式微服务 in java 译 十二 service discovery
  10. preg_replace的一些细节
  11. python字典返回键值对_从Python字典对象中提取键值对的子集?
  12. python程序画中国围棋棋盘
  13. android的popwindow控件,及控件设为圆角
  14. kali Linux sqli labs环境搭建,以及报503错误解决
  15. 我不是教你诈 内容摘要
  16. ps中扩展画布的时候,不能选择扩展画布部分的颜色解决方法
  17. 阿里云服务器盘镜像备份恢复到本地VMware
  18. 基于51单片机的三角波信号发生器设计
  19. 从MySQL Bug#67718浅谈B+树索引的分裂优化
  20. 联网游戏,面部表情捕捉,New Prefabs工作流程预览以及Unite Berlin的更多功能

热门文章

  1. LwIP之ARP协议
  2. STM32之定时器原理
  3. mvc试图 下拉框不重复_面试前不巩固一下基础知识、刷刷题吗?
  4. 阿里二面:外部接口大量超时,把整个系统拖垮,引发雪崩!如何解决?熔断......
  5. 同时面了腾讯三个部门,拿下offer!
  6. Google 6面,最终还是挂了…
  7. 原创 | 为什么阿里巴巴要求谨慎使用ArrayList中的subList方法
  8. 浅谈 Kubernetes 服务发现
  9. 儒枭:我看技术人的成长路径
  10. JAVA字符串占位符替换