树形DP-Apple Tree

【codevs】二叉苹果树 (二叉树的树形dp) P2015 二叉苹果树题目描述有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树2 5 \ / 3 4 \ / 1 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住多少苹果。输 阅读详情

题目传送门
(详细思路)思路参见:https://www.cnblogs.com/fightfordream/p/6653890.htm
这道题想了好久才想明白。。。。。。做这种难度的题对自己还是很有收获的。
/*
个人理解 :首先 这道题要每个节点的权值是x的倍数。因为每个节点都要相等,所以有倍数关系,那么
当前节点u的权值必然是其子节点倍数的最小公倍数。比如其子节点为2n == 4m == 3k;而sum = 2n+3k+4m
所以每个子节点的权值是lcm(2,3,4)的最小公倍数的倍数。这道题用的就是cnt数组记录
还要记录每个节点当前的最大权值。所以用mx。
这道题递归求解,所以分析问题时,只要考虑当前节点即可(举一个3层的树分析),其他的递归求解。
*/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<cstring>
#include<string>
#include<cmath>

using namespace std;

typedef long long LL;

#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define mem(a,b) memset(a,b,sizeof(a))
#define per(i,a,b) for(int i = a;i <= b;++i)
#define rep(i,a,b) for(int i = a;i >= b;--i)
const int maxn = 1e5;
int n = 0,m = 0;
int w[maxn+10];
vector<int> vt[maxn+10];
LL mx[maxn+10];//mx[i]表示节点i权值的最大值 
LL cnt[maxn+10];//cnt[i]表示节点i的权值必须是cnt[i]的倍数 
/*
个人理解 :首先 这道题要每个节点的权值是x的倍数。因为每个节点都要相等,所以有倍数关系,那么
当前节点u的权值必然是其子节点倍数的最小公倍数。比如其子节点为2n == 4m == 3k;而sum = 2n+3k+4m
所以每个子节点的权值是lcm(2,3,4)的最小公倍数的倍数。这道题用的就是cnt数组记录 
还要记录每个节点当前的最大权值。所以用mx。
这道题递归求解,所以分析问题时,只要考虑当前节点即可(举一个3层的树分析),其他的递归求解。 
*/
LL gcd(LL a,LL b){
	return b == 0 ? a : (gcd(b,a%b));
}
LL lcm(LL a,LL b){
	return a/gcd(a,b) * b;
}
void dfs(int curr,int fa){
	int num = 0;
	int size = vt[curr].size();
	for(int i = 0;i <= size-1;++i){
		int v = vt[curr][i];
		if(v == fa){
			continue;
		}
		dfs(v,curr);
		if(num == 0){//刚开始赋值 
			mx[curr] = mx[v];
				cnt[curr] = cnt[v];	
		}else{
			if(cnt[curr] < 1e14){//有溢出的风险 
				cnt[curr] = lcm(cnt[curr],cnt[v]);
			}	
			mx[curr] = min(mx[curr],mx[v]) / cnt[curr] * cnt[curr];
		}
		++num;
	}
	if(num == 0){
		mx[curr] = w[curr];	cnt[curr] = 1;
	}else{
		mx[curr] *= num;	
		if(cnt[curr] < 1e14){
			cnt[curr] *= num;
		}
	}
}
int main(){
	while(~scanf("%d",&n)){
		LL ans = 0;
		per(i,1,n){
			scanf("%d",&w[i]);
			ans += w[i];
		} 
		per(i,1,n-1){
			int u = 0,v = 0;
			scanf("%d %d",&u,&v);
			vt[u].push_back(v);vt[v].push_back(u);
		}	
		dfs(1,-1);
		printf("%I64d\n",ans - mx[1]);
	}
	
	return 0;
}

2020牛客暑期多校训练营Groundhog and Apple Tree(树形dp,贪心) Groundhog and Apple Tree 题目描述 样例 input: 1 5 4 2 1 5 7 1 2 4 1 3 5 4 2 9 5 2 3 output: 23 题目大意 给定一棵树,每条边有权值,点上也有权值。现有一个初始Hp=0Hp=0Hp=0的人,如果经过边,那么HpHpHp减去边权,如果经过点,那么会加上点权。为了保证任何时刻Hp≥0Hp\ge 0Hp≥0,他可以随时休息1分钟,然后增加1HpHpHp。如果每个点的点权只能加一次,每条边只能经过两次,那么如果这个人从1号结点开始,遍 阅读详情

相关推荐

微信小程序音视频通话(for硬件)授权与设备注册实战指南

本文详细介绍了微信小程序音视频通话(for硬件)组件的开发实践,涵盖授权流程、设备注册与VoIP插件集成。重点解析了如何通过服务端获取snTicket实现用户授权,确保硬件设备与微信端的音视频通话安全可靠,适用于智能门禁、话机等物联网场景。

u6v7w8x的博客 945

经典树形DP讲解+例题「一本通 5.2 例 1」二叉苹果树讲解

一般的树因为已经用vector存好了,所以就可以免去建树的过程,于是,就剩下了一个询问的过程,我们这次的询问和前面的完全不同,转移是有点类似于背包DP的,实际上他就是背包DP,然后我们在建树的时候,可以直接把吃点的过程写上去,这样就省去了在查询时不断吃点,导致状态难找,f数组过大的情况。这道题,我们要把树枝上的苹果都压到结点上去,把这个剪线问题改成吃点问题,不仅好理解,代码也好写。至于转移方程,那就简单了,只要把左子树的答案加上右子树的答案再加上左右子树的苹果树,就可以了。

m0_68936950的博客 1399

Python+QMT量化交易实战:从零搭建你的第一个极速策略(附完整代码)

本文提供了一份详细的Python+QMT量化交易实战指南,手把手教你从零搭建一个可回测、可实盘的极速策略。内容涵盖环境配置、QMT核心机制解析、双均线策略的完整代码实现、回测优化方法以及实盘部署要点,帮助量化交易新手快速入门并掌握核心开发流程。

b9c0d的博客 1012

二叉苹果树 树形DP

题意/Description:     有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)      这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。      我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树      2 5       \ /        3 4         \ /

peter_zhu01的博客 1408

常见信号逻辑电平标准介绍:TTL、CMOS、ECL、LVDS、CML

逻辑电平是指数字信号电压的高、低电平,相关参数定义如下:(1)输入高电平门限Vih:保证逻辑门的输入为高电平时所允许的最小输入高电平,当输入电平高于Vih时,则认为输入电平为高电平;(2)输入低电平门限Vil:保证逻辑门的输入为低电平时所允许的最大输入低电平,当输入电平低于Vil时,则认为输入电平为低电平;(3)输出高电平门限Voh:保证逻辑门的输出为高电平时的输出电平的最小值,逻辑门的输出为高电平时的电平值都必须大于此Voh;

liuchj的博客 1万+

告别配置噩梦:用Vcpkg三行命令为Easy3D自动安装Boost、CGAL和Qt(VS2022实测)

本文详细介绍了如何使用Vcpkg工具在VS2022环境下为Easy3D项目一键安装Boost、CGAL和Qt等依赖库,解决传统手动配置的复杂性问题。通过三行简单命令即可自动完成下载、编译和路径配置,大幅提升开发效率,特别适合C++开发者快速搭建3D图形开发环境。

weixin_42525582的博客 209

C++ 树形DP经典例题详解——二叉苹果树

引言 这是十分经典的树形DP题,其转移方程很好想到,但有一些坑要注意 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 2 叉(就是说没有只有 1 个儿子的结点)。这棵树共有 N 个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是 1。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有 4 个树枝的树:现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果...

qq_44013342的博客 1714

Unity——Scroll View 滑动居中、居中的放大、其他的缩小(支持横竖Scroll View)

一、效果 二、上代码,两种方式。 (第一种是在Update中用插值完成的,如果不想再项目中看到Update,下面的另一种改了一段用DoTween实现的,需要导入一下DoTween) using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Unit...

SiReSo 7659

洛谷P2015 二叉苹果树【树形dp】

P2015 二叉苹果树 时间限制 1.00s 内存限制 125.00MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树 2 5 \ / 3 4 \ / 1 现在这颗树枝条太多了,需要剪...

C++的星空 461

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline

title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph...

xiaoyehahaha的博客 731

实战复盘:一次绕过WAF的EDUSRC SQL注入漏洞挖掘

本文详细复盘了一次针对教育行业网站的SQL注入漏洞挖掘实战。通过手动信息收集发现可疑点,并利用‘+’号替换空格等技巧,成功绕过WAF(Web应用防火墙)的拦截。文章逐步演示了从判断注入点到手工获取数据结构、最终解密进入后台的完整过程,并总结了手工测试的优势及高级绕过思路,强调了在EDUSRC等授权范围内进行安全测试的重要性。

weixin_28622215的博客 191

【DP】二叉apple tree 树形dp

关于树形dp:递归建树+递归dp; 关于建树:顺序分左右一搜到底 撞南墙方回; 关于二叉苹果树本题:1.注意题意中的坑点 map可能是0 注意初始化-1和make_tree里的判断条件 2.主函数里q++把边数转为结点数 #include<iostream> #include<cstdio>...

玄兮小黑的博客 273

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

2020暑期牛客多校训练营第九场(B)Groundhog and Apple Tree(树形dp,贪心)

Groundhog and Apple Tree 原题请看这里 题目描述: 土拨鼠非常擅长爬树。 一天,土拨鼠来到一棵苹果树上。出于某种原因,他决定吃掉树上的所有苹果。苹果树上有n{n}n个点,每个点上都有一个苹果。这些点由n−1{n-1}n−1条边连接(所有点都被连接)。在每个边上都有一个障碍物,这需要一定的HPHPHP才能让GroundhogGroundhogGroundhog跳过。如果GroundhogGroundhogGroundhog吃了ith{i ^ {th }}ith在树上的苹果,他可以恢复a

s260127ljy的博客 588

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

树形dp Apple Tree

题目链接 #include&lt;stdio.h&gt; #include&lt;iostream&gt; #include&lt;string.h&gt; #include&lt;algorithm&gt; using namespace std; int vis[300],dp[300][300][3],val[300],head[300]; int n,k,cnt; struct node ...

qq_41006240的博客 187

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[Poj 2486] Apple Tree 树形DP

Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9069 Accepted: 3016Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tre

ATOD 1806

POJ2486 Apple Tree 树形DP

POJ2486 Apple Tree 树形DP

qq_44919369的博客 400

POJ 2486 Apple Tree 树形DP

题意:一个小女孩到了一颗苹果树上。苹果树上每个节点都有不同数量的苹果。现在小女孩从根结点出发,最多走K步,问最多可以吃到多少苹果? 思路:树形DP,和前面一道题同样的思路。 定义dp[u][j][1]为从节点u出发,在以u为根的子树中行走了j步,最终留在了子树中。 dp[u][j][0]为从节点u出发,在以u为根的子树中行走了j步,最终没有留在子树中。 下面考虑状态转移: 1.对于dp[u

leodestiny 632

poj 2486 Apple Tree (树形dp)

Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6674   Accepted: 2208 Description Wshxzt is a lovely girl. She likes apple very much. One day HX t

To be what you what to be! 1448

POJ 2486——Apple Tree【树形DP】

题目传送门 Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There are N nodes in the tree. Each node has an amount of apples. Wshxzt starts her happy ...

NIRVANA REBIRTH 315

apple tree POJ2486 树形dp

题目链接http://poj.org/problem?id=2486 题目大意:给你一颗树,树上每个点有一个点权,让你从1号点走k步,问可以得到的最大点权和是多少? 思路:这道题既然是个树结构,我们很容易想到是树形dp 设计状态: 由于我们走到一个点有可能是要回到这个点走到另一颗子树上去,也有可能不回来。所以要设两个状态: 1.dp[0][x][s]dp[0][x][s]dp[0][x][s]表示...

luyan0408的博客 184

(树形dp)Binary Apple Tree

Let’s imagine how apple tree looks in binary computer world. You’re right, it looks just like a binary tree, i.e. any biparous branch splits up to exactly two new branches. We will enumerate by intege...

weixin_40588429的博客 238

【poj2486】【Apple Tree】【树形dp】

Apple TreeTime Limit: 1000MS Memory Limit: 65536K Total Submissions: 7893 Accepted: 2642 DescriptionWshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree.

Vampire 1339

【树形DP】 POJ 2486 Apple Tree

题目链接:  POJ 2486 Apple Tree 分析:        这题最重要的一个地方是可能会走回头路.       那么,我们对某一结点可分为两种状态, 即访问其子结点后回来及不回来.       当访问到某一结点的子结点时, 有以下三种情况:       PS. dp[u][i][j]  表示到结点i已经走了j步,得到最多的苹果数.  u=0 表示不

PWZER 1006

POJ-2486 Apple Tree 树形DP

题意:一棵n个点的树,每个点有苹果数vi,每条边长度为1。从树根1出发,你不能走多于m步,走到一个点就能获得该点苹果,问能获得最多苹果是多少个? 解法:这道题想了挺久的还是没想到只能看题解了。很经典的树形DP了。 很容易想到设dp[x][j]表示x子树分配j步能获得最多苹果数量,但是这样是不够的,因为很容易发现只有哪些回到了x点的方案的代价才是子树大小*2,但是走到最后的时候其实可以不用回到x...

weixin_30329623的博客 204
上一篇: 计数DP-牛客41B-666RPG
下一篇: Painting the Fence-差分+前缀和
Mavis code
博客等级 码龄9年 13粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值