二叉苹果树 【树形dp(背包)】

news2024/11/22 23:43:07

来源:牛客网
题目链接:https://ac.nowcoder.com/acm/contest/25022/1006


题目描述

有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点。这棵树共N个节点,标号1至N,树根编号一定为1。
我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵有四根树枝的苹果树,因为树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。

输入描述:

第一行两个数N和Q,N表示树的节点数,Q表示要保留的树枝数量。
接下来N-1行描述树枝信息,每行三个整数,前两个是它连接的节点的编号,第三个数是这根树枝上苹果数量。

输出描述:

输出仅一行,表示最多能留住的苹果的数量。

示例

输入

5 2

1 3 1

1 4 10

2 3 20

3 5 20

输出

21

备注:

对于100%的数据,1 ≤ Q ≤ N ≤ 100,N ≠ 1,每根树枝上苹果不超过30000个。

 思路:

1. 题意解读

剪掉一根枝条后,它所连的下面的所有枝条都会没有(根在上);

2. 数据存储

题意所述的“权值”其实为边权,但用边权表示并不方便,考虑到一条边如果不存在了,那么它下面所连的点也将不复存在,于是每一条边的值可以“下放”到它所属的点上。

3. 状态转移:

令 f[x][j] 表示以 x 为根节点的子树总共有 j 条边的最大权值(苹果树量),,则分为以下三种情况:(x 的左子节点用 left 表示,右子节点用 right 表示,apple[x][y] 表示连接点x 和 y的枝条上的苹果数)

  • 【j条边全在左边,右边为0】:left 点以下有 j-1 条边,因为点 x 到点 left算一条边。则:f[x][j] = max( f[x][j], f[left][j-1] + apple[x][left] ).
  • 【j条边全在右边,左边为0】:同理,f[x][j] = max(f[x][j], f[right][j-1] + apple[x][right]).
  • 【左右都有】:设 left 点以下有 k 条边,则 right 点以下有 j - k - 2 条边,因为还要加上" x->left"这条边和"x->right"这条边,则:f[x][j] = max(f[x][j], f[left][k] + f[right][j-k-2] + apple[x][left] + apple[x][right] ).

4.拓展版:二叉树-->多叉树

如果有 n 叉,难道我们也要全部列出来吗?一根枝条有选和不选两种可能,那么 n 根则要列举 2^{n}-1种(减一是去掉“都不选”的情况),这时候的问题就像是,把枝条上的苹果数看成“价值”,枝条数目看成限制条件:“体积”,则就是在 n 个物品中选取若干价值不同的物品,选或不选,在体积为 q 的情况下求最大价值——典型的“背包问题”

状态转移方程:

f[x][j]=max(f[x][j],f[x][k]+f[y][j-k-1]+w);

在已经选取 k 根枝条的情况下不断加入新的枝条,注意,与普通背包问题一样,k 要从大到小枚举以防止“ 重复选择(多重背包)”。

代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n,q,f[110][110];
vector<int> edge[110],app[110];
void dfs(int x,int fa){//复杂度: O(n^3)
	for(int i=0;i<edge[x].size();i++){
		int y = edge[x][i];
		if(y==fa)continue;
		dfs(y,x);
		for(int j=q;j>=0;j--){//树上背包,从大到小 
			for(int k=0;k<j;k++){
				f[x][j]=max(f[x][j],f[x][k]+f[y][j-k-1]+app[x][i]);
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=1,x,y,z;i<n;i++){
		cin>>x>>y>>z;
		edge[x].push_back(y);
		app[x].push_back(z);
		edge[y].push_back(x);//双向边 
		app[y].push_back(z);
	}
	dfs(1,0);
	cout<<f[1][q];
	return 0;
}

也可以把上述代码中的edge 和 app 合成一个pair来写:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int M=110;
int n,q,f[M][M];
vector<pair<int,int> >ve[M];
void dfs(int x,int fa){
	for(auto p:ve[x]){
		int y=p.first, w=p.second;
		if(y==fa)continue;
		dfs(y,x);
		for(int j=q;j>=0;j--)
		for(int k=0;k<j;k++)
		f[x][j]=max(f[x][j],f[x][k]+f[y][j-k-1]+w);
	}
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=1,x,y,z;i<n;i++){
		cin>>x>>y>>z;
		ve[x].push_back({y,z});
		ve[y].push_back({x,z});
	}
	dfs(1,0);
	cout<<f[1][q];
	return 0; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rollup.js配置环境变量

场景: 由于项目是通过svelte.js rollup.js框架搭建起来的, 并没有使用到cli脚手架, 没有办法配置不同环境的变量一. 使用cross-env添加环境变量安装cross-env&#xff0c;它可根据不同的系统设置环境变量npm install cross-env --save-dev在 package.json 中&#xff1a;"…

MongoDB索引

介绍 增加查询效率&#xff0c;不必每次都全表扫描单字段索引&#xff1a;在用户单个字段上创建升序/降序索引复合索引&#xff1a;在多个字段上添加索引&#xff1b;如{name:1, age:-1}&#xff0c;关注field顺序其他索引&#xff1a;地理空间索引&#xff0c;文本索引&#x…

浙大MBA复试经验和真题分享——知己知彼胜率更高

前段时间跟朋友吃饭的时候&#xff0c;问我在浙大读MBA是什么体验&#xff1f;其实说实话&#xff0c;当时选择浙大&#xff0c;主要还是为了学历&#xff0c;觉得自己一个普通的二本学历真的平平无奇&#xff0c;公司里面新进的员工虽然年纪轻&#xff0c;但学历却很有来头&am…

PySpark任务提交spark-submit参数设置一文详解

目录 前言 一、PySpark集群运行原理 二、spark-submit参数详解 1.指定运行目录 2.--deploy-mode 3.--master 4.驱动程序和执行器资源 5.--files和--verbose 6.Spark提交配置 三.PySpark程序提交配置选项 1.构建一套虚拟环境 2. 模块依赖问题原因 参阅 前言 之前我们已…

MySQL 笔记

文章目录安装MySQL 语法格式MySQL数据类型命令操作数据库CRUD查询创建表删除表修改表操作数据增改删查基础查询条件查询模糊查询排序查询分组查询分页查询聚合函数约束约束分类安装 软件安装&#xff5c;macOS下超详细的MySQL安装 MySQL 语法格式 每条语句以分号;结尾&#…

LeetCode150.逆波兰表达式

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码&#x1f4dc;题目描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意 有效的算符为 、-、* 和/。…

如何mock当前类的私有方法

背景 基础知识 mockito单元测试&#xff1a;它的做法是mock掉当前类的所有外部依赖&#xff0c;保障自己的代码没有问题。举个例子&#xff0c;如果数据库查询的语句出了问题&#xff0c;单元测试不会测试出来。因为它直接mock掉了&#xff0c;不会去真的去查数据库。从这点来…

电压放大器在大功率脉冲电能源研究中的应用

实验名称&#xff1a;大功率脉冲电能源高精度测试技术研究 研究方向&#xff1a;仪器仪表测试 测试目的&#xff1a; 传统的测量精度校准的方法是对传感器单一频率下的刻度因子进行校准&#xff0c;校准方法通常选用同轴分流器串联于放电回路中&#xff0c;通过测量同轴分流器两…

Ubuntu18.04下安装mysql并使用QT成功编译驱动方法

开发环境&#xff1a;Ubuntu18.04QT5.14.2MySQL5.7.240 编译步骤&#xff1a; 1、安装mysql软件和驱动&#xff1a; 打开终端命令&#xff0c;执行安装语句如下&#xff1a; sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install lib…

MyBatisPlus(MP)学习记录(分页查询的开启+日志打印配置)

MP介绍&#xff08;官网链接&#xff09; MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 前言 本篇文章展示的MP教学中涉及到的版本如下&#xff1a; IDE…

使用Xshell 将Linux文件下载到本地或者将本地的文件上传到Linux

第一步&#xff1a;在Linux中安装上传下载功能的软件 sudo apt install lrzsz第二步&#xff1a;将Linux文件下载到本地&#xff1a;此时我的Linux桌面上有一个叫test.c的文件&#xff0c;我要将它下载到windows桌面上。 在Linux终端输入&#xff1a; sz test.c这里使用的是…

座舱显示的未来到底是什么?宝马供应商给出了答案

“显示器是汽车的核心人机界面&#xff0c;”业内人士表示&#xff0c;与此同时更智能化、体验更好的显示解决方案在驾驶舱的设计中起着核心作用。 屏幕及其增强驾驶体验的巨大潜力正迅速成为未来智能网联汽车DNA的一部分。高分辨率、大尺寸以及曲面屏、OLED屏等等新元素&…

【手写 Vue2.x 源码】第十九篇 - 根据 vnode 创建真实节点

一&#xff0c;前言 上篇&#xff0c;根据 render 函数&#xff0c;生成 vnode&#xff0c;主要涉及以下几点&#xff1a; 封装 vm._render 返回虚拟节点_s&#xff0c;_v&#xff0c;_c的实现 本篇&#xff0c;根据 vnode 虚拟节点渲染真实节点 二&#xff0c;根据 vnode 创…

SpringCloud项目实例3--Nacos整合

然后新建一个Module&#xff0c;命名为nacos-provider-demo&#xff0c;Java代码的包名为ltd.newbee.cloud。在该Module的pom.xml配置文件中增加parent标签&#xff0c;与上层Maven建立好关系。之后&#xff0c;在这个子模块的 pom.xml 文件中加入Nacos的依赖项 spring-cloud-s…

谈一谈暴露偏差

文章由参考文章重新组合而来。 暴露偏差又叫Exposure Bias&#xff0c;是由Teacher Forcing 导致的。 Teacher Forcing Teacher Forcing 是一种用于序列生成任务的训练技巧&#xff0c;与Autoregressive模式相对应&#xff0c;这里阐述下两者的区别&#xff1a; Autoregres…

【Flink系列】部署篇(一):Flink集群部署

主要回答以下问题&#xff1a; Flink集群是由哪些组件组成的&#xff1f;它们彼此之间如何协调工作的&#xff1f;在Flink中job, task, slots,parallelism是什么意思&#xff1f;集群中的资源是如何调度和分配的&#xff1f;如何搭建一个Flink集群&#xff1f;如何配置高可用服…

目标检测再升级!YOLOv8模型训练和部署

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.12 Last edited: 2023.1.12 目录 目标检测再升级&#xff01;YOLOv8模型训练和部署 简介 YOLOv8创新改进点 区别 1、C2f模块是什么&…

探索与创新:低代码助力金融数字化转型发展

“十四五”规划和 2035 年远景目标纲要提出“加快数字化发展&#xff0c;建设数字中国”&#xff0c;并就打造数字经济新优势、加快数字社会建设步伐、提高数字政府建设水平、营造良好数字生态作出战略部署。这为数字中国的下一步发展指明了方向&#xff0c;提供了指引。可以说…

CentOS环境下Rabbit集群部署

前言本次Rabbit集群部署所使用的的软件版本erlang&#xff1a;erlang-23.3.3-1.el7.x86_64.rpm &#xff0c;rabbitmq&#xff1a;rabbitmq-server-3.8.23-1.el7.noarch.rpm本次Rabbit集群部署需要安装在两台CentOS服务器分别为svr-app-rabbitmq01、svr-app-rabbitmq02&#xf…

Trime同文输入法JNI加载过程

Trime同文输入法JNI加载过程JNI初始化顺序第一步、加载librime_jni.so库第二步、自动注册机制第三步、正式加载librime_jni.so库插入一个话题、简化打印记录第四步、执行Rime.java中的init()方法LoadModules()LoadModule()rime_core_initialize()调用顺序Class不是class关键字&…