二叉苹果树(树上背包dp)

AcWing1074. 二叉苹果树(树形DP)题解 题目传送门 题目描述 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点。 这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1。 我们用一根树枝两端连接的节点编号描述一根树枝的位置。 一棵苹果树的树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。 这里的保留是指最终与1号点连通。 输入格式 第一行包含两个整数 N 和 Q,分别表示树的节点数以及要保留的树枝数量。 接下来 N−1 行描述树枝信息,每行三个整数,前两个是它连接的节点的编号 阅读详情

题目:

思路分析:

树根已经确定为1

然后son数组为该节点有几个子节点

f[u][j] //表示以u节点为根的树,保留j个节点后可以保留的最大苹果数

状态f[u][j],可以由f[u][j-k]+f[v][k]+a[u][v]转移过来。
因此状态转移方程为:f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]+a[u][v]);1)f[][]数组一开始要初始化为负无穷。这么初始化是为了保证子节点只能由其父节点转移而来。
最后的结果为f[1][q+1]。因为f[u][j]表示的是保留了j个节点,而题目要求是保留q条边。而 树的边数=节点数+1

代码实现:


#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
typedef long long  ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
using namespace std;


const int MAX=110;
int n,q;
int head[MAX];
int cnt;
struct node{
    int to,w;
};
vector<node>e[MAX];
int f[MAX][MAX];
int son[MAX];
void dfs(int u,int fa){
    son[u]=1;
    f[u][1]=0;
    for(int i=0;i<e[u].size();i++){
        int ne=e[u][i].to;
        if(ne==fa) continue;
        dfs(ne,u);
        son[u]+=son[ne];
        
        for(int j=son[u];j>0;j--){
            for(int k=1;k<=son[ne]&&k<=j;k++){
                f[u][j]=max(f[u][j],f[u][j-k]+f[ne][k]+e[u][i].w);
            }
        }
        
    }
}
int main(){
    cin>>n>>q;
    mms(f,-0x3f3f3f3f);
    for(int i=1;i<=n-1;i++){
        int u,v;
        int w;
        cin>>u>>v>>w;
        e[u].push_back({v,w});
        e[v].push_back({u,w});
    }
    dfs(1,-1);
    cout<<f[1][q+1];
}

VB.net:VB.net编程语言学习之ADO.net基本名称空间与类的简介、案例应用(实现与SQL数据库编程案例)之详细攻略 ADO.net有六个基础名称空间,除此之外,每个新的数据提供程序还可以有自己的名称空间,如Oracle。在.net中就提供了System.Data.OracleClient名称空间(用于Microsoft建立的Oracle数据库提供的程序)ADO.net体系结构的另一个核心元素是.Net数据提供程序(Data Provider),它的组件用于进行数据处理(和DataSet的数据访问功能相对应)。:是ADD.net核心名称空间,它包含所有数据提供程序使用的类,这些类表示表、列、行,还有DataSet类; 阅读详情

相关推荐

告别龟速与断连:Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南

本文提供Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南,解决下载速度慢、断连等常见问题。通过国内镜像源加速、详细步骤讲解和ESP32-CAM专属配置技巧,帮助开发者快速完成环境搭建,避免常见陷阱,提升开发效率。

weixin_30576827的博客 771

二叉苹果树

二叉苹果树https://www.luogu.org/problemnew/show/P2015 题目描述 有一棵苹果树,如果树枝有分叉,一定是分\(2\)叉(就是说没有只有\(1\)个儿子的结点) 这棵树共有\(N\)个结点(叶子点或者树枝分叉点),编号为\(1-N\),树根编号一定是\(1\)。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。 现在这颗树枝条太多了,需要剪枝...

277

Apache Paimon-实时数据湖

Flink社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehouse 新架构优势进一步结合,推出新一代的 Streaming Lakehouse 技术,促进数据在数据湖上真正实时流动起来,并为用户提供实时离线一体化的开发体验。Flink 社区内部孵化了 Flink Table Store (简称 FTS )子项目,一个真正面向 Streaming 以及 Realtime的数据湖存储项目。

m0_57307642的博客 2193

1074 二叉苹果树(树形dp)

1. 问题描述: 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点。这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1。我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵苹果树的树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。这里的保留是指最终与1号点连通。 输入格式 第一行包含两个整数 N 和 Q,分别表示树的节点数以及要保留的树枝数量。接下来 N−1 行描述树枝信息,每行三个整数,前两个是它连接的节点的编号,第三个

二哈 988

避坑指南:PVE下N卡直通错误代码43的终极解决思路与dmesg日志分析

本文详细解析了PVE环境下NVIDIA显卡直通时遇到的错误代码43问题,提供了从dmesg日志分析到BIOS配置、PVE宿主机优化及虚拟机设置的完整解决方案。特别针对GTX1060等显卡,分享了驱动版本选择、ROM修补及高级排错技巧,帮助用户彻底解决这一常见难题。

weixin_28693683的博客 290

中国城市统计年鉴1991-2024面板数据真正无缺失值填补指标说明

大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。大学普通高等中等职业教育成人中小学学前教育在校学生人数。

yushibing717的博客 928

[树形dp] 二叉苹果树

有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)。这棵树共有N个结点(叶子点或者树枝分叉点),编号为1∼N,树根编号一定是1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树。现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住多少苹果。

m0_64542522的博客 854

【DAY11】超参数调整专题1

核心优势: 它不是随机选择下一个点,而是根据先前评估的结果建立一个概率模型(通常是高斯过程),预测哪些参数组合可能产生更好的结果,并据此选择下一个评估点。这使得它在寻找最优解方面通常比随机搜索更高效(用更少的迭代次数达到相似或更好的性能),特别是当模型训练(单次评估)非常耗时的时候。实际上,有着非常多的方式可以实现贝叶斯优化,上面的代码比较简洁美观,贝叶斯优化和网格搜索的代码书写风格高度一致。- 需要定义参数的搜索空间,与随机搜索类似,当搜索空间非常大时,它通常比网格搜索和随机搜索更有效。

daomingwu1的博客 747

洛谷2015 二叉苹果树 树形DP

https://www.luogu.org/problemnew/show/P2015 二叉苹果树 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 2 叉(就是说没有只有 1 个儿子的结点) 这棵树共有 N 个结点(叶子点或者树枝分叉点),编号为 1 - N 树根编号一定是 1。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位...

紫芝的博客 847

K230在原有LVGL控件触摸屏控制的基础上,增加USB鼠标控制!

搭配CanMV图形化编程,中小学生可快速开发“键鼠控制AI小游戏”“智能画板”等趣味项目,降低AI学习门槛;:HDMI屏幕+键鼠组合,直接在开发板上调试代码、修改ISP参数、查看AI推理日志,无需频繁连接电脑;:打造带交互的AI设备(如工业控制面板、智能显示器),鼠标操作菜单、键盘输入指令,体验媲美小型PC;:无网络场景下,通过键盘直接向AI设备录入数据、配置参数,适配野外监测、本地工控等场景。,自动识别、快速响应,完美适配交互控制、参数调试、数据输入等场景。

weixin_47446386的博客 146

CATIA二次开发一一一装配体与零件之间的坐标转换

输入参数:Product(产品实例对象)、iPointToTransfor(待转换坐标点CATMathPoint)核心逻辑:通过产品对象的绝对位置变换矩阵,计算逆向变换实现坐标系转换。输出参数:Point(转换后的局部坐标点CATMathPoint)

工业软件开发 1129

数字转化(树形dp)

思路:先求出n的所有约数之和,然后在符合条件的两个数之间建边,小的点是父节点,然后跑一遍树上最长距离。 #pragma GCC optimize(2) #include <cstdio> #include <cstring> #include <algorithm> #include <set> #include<iostream> #include<vector> #include<queue> #include<.

Ray.C.L的博客 663

OpenHarmony WiFi子系统全解析:从架构到代码实现(大合集)

头文件路径[相对路径][相对路径][相对路径][相对路径]// 网络配置结构 (wifi_device_config.h)// SSID字符串// 预共享密钥// 安全类型// 网络ID// 优先级// 是否隐藏网络// 扫描信息结构 (wifi_scan_info.h)// SSID// BSSID (MAC地址)// 安全类型int rssi;// 信号强度// 频率// 信道宽度// 时间戳// 连接信息结构 (wifi_linked_info.h)

m0_67505153的博客 1059

P2015 二叉苹果树 树上dp+分组背包

P2015 二叉苹果树 题目大意: 有一颗树,根是 1 ,每条边上有对应的权值,保留 q 条边,问剩下的权值最多可以是多少,剩下的边一定要和根节点联通。 思路: dp[i][j]dp[i][j]dp[i][j] 表示第 iii 个节点保留 jjj 条边的最大权值,那么答案就是 dp[1][q]dp[1][q]dp[1][q]。 发现是树上 dpdpdp 的分组背包,每个节点都是对应的组,每个组内的物品有 qqq 个,每个节点的贡献只能计算一次,那就是裸的分组背包 第一层循环遍历节点等价于遍历组 第二层循环遍

想学开哥的博客 287

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

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

树型DP #二叉苹果树,树上的01背包问题

v子树中选取k条边,已经遍历的u子树中选择j-k-1条边,得到当前u子树选取j条边的状态。这里的v子树是e[i]😇 本篇文章可能存在多处不足,如有修改意见,可以私信或者评论我哦 😇。🌻编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻。对于每条边,都有选择或者不选,树上的01背包问题。每个物品体积为1,价值就是其边权。Acwing & 董晓算法 🌹。

mengzh的博客 391

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[树上依赖多重背包 DP] BZOJ 4910 [Sdoi2017]苹果树

题目 t−h≤kt-h\le k 的限制其实就是选一条到叶节点的链,然后再选k个的最大值(因为vi都大于零)。因为 ai>1ai>1 的点,肯定是先选了第一个才会选第二个 所以可以把 ai>1ai>1 的点拆成两个点 i′,i′′i',i'',ai′=1ai'=1,ai′′=ai−1ai''=ai-1,让 i′′i'' 变成 i′i' 的儿子。这个树上依赖背包可以通过两个遍历子树顺序相反的后序遍历

CE玩家 1519

P2015 二叉苹果树

动态规划, 树上DP, 树上背包

Ayanami_Rei的博客 1067

洛谷 P2015 二叉苹果树 (树上背包)

洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包。 首先,定义状态\(dp[x][i]\)表示在节点\(x\)保留\(i\)个边所获得的最大苹果数,定义状态时一定要选对状态并且定义清晰(状态中包括了当前节点吗?目标状态是怎样的?)。一开始我就是因为状态定义错误,所以卡了半...

weixin_30664539的博客 196

洛谷 P2015 二叉苹果树

洛谷 P2015 二叉苹果树 题目: 有图。转链接 题解: 树形dp。 任然是有依赖的树上背包。 树上背包思路可以转这篇,值得注意的是,题目中输入的是保留的边数,那么我们要将其转换成点数 = 边数 + 1 #include <iostream> #include <cstdio> #define N 105 using namespace std; st...

aochongbi5356的博客 187

DP - 树形DP - 二叉苹果树

DP - 树形DP - 二叉苹果树 有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点。 这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1。 我们用一根树枝两端连接的节点编号描述一根树枝的位置。 一棵苹果树的树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。 这里的保留是指最终与1号点连通。 输入格式 第一行包含两个整数 N 和 Q,分别表示树的节点数以及要保留的树枝数量。 接下来 N−1 行描述树枝信息,每行三个整数,前两个是它连

njuptACMcxk的博客 293

基础树形DP小结

HDU 1520  Anniversary party 隔层选取,比较基础的树形DP了。 HDU 2196 Computer 我只想说一句这是毛线DP,明明是图论好么。 两次BFS求出权值和最大的一条链,再用两次BFS更新各点最大值。 搜了一下,真的有人用DP做,貌似更快一些。

自在飞花 1065

树形DP——专题

树形DP介绍 节点选择类题目推荐: P1352 没有上司的舞会 P1122 最大子树和 P2016 战略游戏 P1131 [ZJOI2007] 时态同步 牛客—旅游 牛客—黑白树 树上背包类题目推荐: P2015 二叉苹果树 P2014 [CTSC1997]选课 P3177 [HAOI2015]树上染色 P1270 “访问”美术馆 P3360 偷天换日 ...

自伤无色的博客 216

【例 1】二叉苹果树(信息学奥赛一本通- P1575)

dp[u][j]:表示以u为根的子树中,保留j根树枝所能获得的最大苹果数。循环边界代码中k<jk<=j-1(预留连接线)。k<=sz[v]-1(子树树枝上限)。这保证了逻辑的严密性。初始化sz[x]初始为 1(节点数)。dp数组全局初始化为 0,符合题目逻辑(不保留树枝则价值为 0)。复杂度利用sz优化,我们将无效的状态转移全部剪枝,使得算法能在大数据范围下高效运行。%20w%29。

布心老混子 所有代码均老混子本人远古手搓 易错点均为学生真实场景 博客文章部分借助ai生成 672

动态规划模型总结之树形dp

刚讲完状压,我们来讲讲树形dp 1.基本概念 树形dpdpdp,顾名思义就是在树上做动态规划,通过若干次的遍历树,得到有用的信息,解决问题 树形dpdpdp的枚举顺序类似线性dpdpdp,也有两个方向: ①:叶→根:根的子节点传递有用的信息给根,由根得出最优解 ②:根→叶:需要取出所有点作为根节点求值,最后根节点获得整棵树的信息 动态规划的顺序一般是后序遍历,即当子节点处理完成再处理父节点 树形d...

Hacheylight 774

2026 4.13-4.19

SMU 2026 Spring 天梯赛8 7-1 7-2 7-3 7-4 7-5 7-6 7-7 7-10 7-12 7-13。牛客竞赛 Round 139 ABCDE。2026天梯赛 L2-3 L2-4。

2502_94178633的博客 33

备战蓝桥杯---树形DP基础3

其中相加操作dp[i]记录了到目前为止的最大值(有点类似背包),通过dp[i]+dp[v]就实现了最大值与次大值相加的操作,最后维护一下dp[i]即可。2.转移方程中应为dp[root][j-k]而不是dp[root][j-k-1],因为root时已经把root点算进去了,不用为root留空间。这样子我们就不可以直接按照上次的方法DP,我们其实可以发现,我们可以用类似背包的思想求解,这就是所谓的树上背包。我们令ans为答案值,dp[i]为以i为起点的最大权值,我们在求dp[i]的同时维护ans即可。

cocoack的博客 655
上一篇: 树上子链(树形dp 树的直径)
下一篇: 选课 (树形dp)
郭晋龙
博客等级 码龄6年 940粉丝 449原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值