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

上一次我们讲了二叉苹果树,现在我们加一点难度,从二叉变成了多叉苹果树。

这样子我们就不可以直接按照上次的方法DP,我们其实可以发现,我们可以用类似背包的思想求解,这就是所谓的树上背包。

我们先加进第一个儿子来跟新1--m的解,然后再让第二个进来更新,这样子就求出来了。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,q,x,y,head[200],v[200],cnt,z,dp[110][110];
struct node{int dian,next,quan;
}edge[210];
void merge(int x,int y,int z){edge[++cnt].dian=y;edge[cnt].quan=z;edge[cnt].next=head[x];head[x]=cnt;
}
void dfsquan(int root,int fa){for(int i=head[root];i!=-1;i=edge[i].next){if(edge[i].dian==fa) continue;v[edge[i].dian]=edge[i].quan;dfsquan(edge[i].dian,root);}return;
}
void dfsdp(int root,int fa){for(int j=q+1;j>=1;j--){dp[root][j]=v[root];}dp[root][0]=0;for(int i=head[root];i!=-1;i=edge[i].next){if(fa==edge[i].dian) continue;int ckck=edge[i].dian;dfsdp(ckck,root);for(int j=q+1;j>=1;j--){for(int k=0;k<=j-1;k++){dp[root][j]=max(dp[ckck][k]+dp[root][j-k],dp[root][j]);}}}
}
int main(){cin>>n>>q;memset(head,-1,sizeof(head));for(int i=1;i<=n-1;i++){cin>>x>>y>>z;merge(x,y,z);merge(y,x,z);}dfsquan(1,-1);dfsdp(1,-1);cout<<dp[1][q+1];
}

这里有两点注意:

1.v[root]操作不应该放在循环里面,否则会重复操作(若为边权可以)

2.转移方程中应为dp[root][j-k]而不是dp[root][j-k-1],因为root时已经把root点算进去了,不用为root留空间。

接题:

其实我们可以不用DP:

我们可以先选任意一点DFS求出权值最大的子链,我们可以证明权值最大的子链的端点之一一定是这个DFS后的端点。

下面进行证明:

我们再来看看树形DP的解法:

我们令f[i]表示以i为根的子树的最大子链,有两种情况,1.它经过i 2.他没有经过

对于经过i,我们只要把以i为起点DFS的最大长度与第二大长度相加即可。

这里我们可以简化一下:

我们令ans为答案值,dp[i]为以i为起点的最大权值,我们在求dp[i]的同时维护ans即可。

其中相加操作dp[i]记录了到目前为止的最大值(有点类似背包),通过dp[i]+dp[v]就实现了最大值与次大值相加的操作,最后维护一下dp[i]即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node1{int dian,next;
}edge[200010];
int head[100010],n,a[100010],cnt,u,v,dp[100010],ans=-10000000;
void merge(int x,int y){edge[++cnt].dian=y;edge[cnt].next=head[x];head[x]=cnt;
}
void dfsdp(int root,int fa){dp[root]=a[root];ans=max(ans,a[root]);for(int i=head[root];i!=-1;i=edge[i].next){if(edge[i].dian==fa) continue;dfsdp(edge[i].dian,root);ans=max(ans,dp[edge[i].dian]);ans=max(ans,dp[root]+dp[edge[i].dian]);dp[root]=max(dp[root],a[root]+dp[edge[i].dian]);}return;
}
signed main(){cin>>n;memset(head,-1,sizeof(head));for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}for(int i=1;i<=n-1;i++){scanf("%lld%lld",&u,&v);merge(u,v);merge(v,u);}dfsdp(1,-1);cout<<ans;
}

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

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

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(挂载卸载事件)

挂载卸载事件指组件从组件树上挂载、卸载时触发的事件。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 onAppear onAppear(event: () > void) 组件挂载显示时触发此回调。 卡片能力&#xff1a; …

go语言魔法技能go:linkname

我们在看Go语言的源码时&#xff0c;经常会看到一些特别的注释&#xff0c;比如&#xff1a; //go:build //go:linkname //go:nosplit //go:noescape //go:uintptrescapes //go:noinline //go:nowritebarrierrec等等&#xff0c;这些特别的注释其实是Go编译器的指示指令。这里…

VUE实现Office文档在线编辑,支持doc/docx、xls/xlsx、ppt/pptx、pdf等

1.微软提供的在线Office预览&#xff08;只能预览&#xff0c;不能编辑&#xff09; https://view.officeapps.live.com/op/view.aspx?src服务器上文档地址&#xff08;http开头&#xff09; 2.国内在线Office方案&#xff1a; 腾讯文档、石墨文档、飞书 优势&#xff1a;跨…

Linux红帽rhce认证多少钱?考个RHCE难不难?

Linux作为开源操作系统的佼佼者&#xff0c;已经广泛应用于各个领域。红帽认证工程师(Red Hat Certified Engineer&#xff0c;简称RHCE)作为Linux领域权威的认证之一&#xff0c;自然成为了众多IT从业者追求的目标。那么&#xff0c;RHCE认证的培训费用是多少?考取这一认证又…

Linux的条件变量

条件变量 条件变量本身不是锁&#xff0c;但是它可以造成线程阻塞。通常于互斥锁配合使用。给多线程提供一个会和的场合。 使用互斥量保护共享数据使用条件变量可以造成线程阻塞&#xff0c;等待某个条件的发生&#xff0c;当条件满足的时候解除阻塞。 条件变量的两个动作&a…

python 基础知识点(蓝桥杯python科目个人复习计划55)

今日复习内容&#xff1a;做题 例题1&#xff1a;体育健将 问题描述&#xff1a; 小蓝作为班级里的体育健将&#xff0c;他被安排在校运会时参加n个体育项目&#xff0c;第i个体育项目参赛需要耗时ai分钟&#xff0c;赛后休息需要bi分钟&#xff08;这意味着当他参加完这场比…

【AIGC大模型】InstantID 赏析

论文地址&#xff1a;https://arxiv.org/abs/2401.07519 InstantID 主页&#xff1a;https://instantid.github.io/ Demo &#xff1a;https://huggingface.co/spaces/InstantX/InstantID code&#xff1a; InstantID/InstantID: InstantID : Zero-shot Identity-Preserving…

计算机组成原理-第一/二章 概述和数据的表示和运算【期末复习|考研复习】

文章目录 前言第一章 计算机组成原理 概述及各种码1.1 计算机硬件的基本组成1.1.1 存储器1.1.2 运算器1.1.3 控制器 1.2 计算机的工作过程1.3 计算机的性能指标1.4 各个字长区别与联系 第二章 数据的表示与运算2.1 ASCII码2.2 各种码2.3 浮点数 总结 前言 给大家整理了一下计算…

雅特力AT32L021首款低功耗MCU震撼登场

雅特力于2月28日正式发布AT32L021首款入门级低功耗MCU&#xff0c;搭配不同容量Flash、SRAM&#xff0c;提供7种封装类型共21个型号选择&#xff0c;最小封装面积仅3x3mm。为降低能耗&#xff0c;延长设备运作时间&#xff0c;AT32L021系列支持多种能耗模式和休眠模式&#xff…

Mysql Day07

存储过程 -- 存储过程基本语法 -- 创建 create procedure p1() begin select count(*) from student; end; -- 调用 call p1(); -- 查看 select * from information_schema.ROUTINES where ROUTINE_SCHEMA itcast; show create procedure p1; -- 删除 drop procedure if exis…

TCP/UDP模型:2024/2/29

作业1&#xff1a;TCP模型 服务器端&#xff1a; #include <myhead.h> #define SER_IP "192.168.199.129" #define SER_PORT 8899int main(int argc, const char *argv[]) {//1.创建用于连接的套接字文件int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){per…

深入理解nginx的https alpn机制

目录 1. 概述2. alpn协议的简要理解2.1 ssl的握手过程2.2 通过抓包看一下alpn的细节3. nginx源码分析3.1 给ssl上下文设置alpn回调3.2 连接初始化3.3 处理alpn协议回调3.4 握手完成,启用http协议4.4 总结阅读姊妹篇:深入理解nginx的https alpn机制 1. 概述 应用层协议协商(…

基于Siamese网络的zero-shot意图分类

原文地址&#xff1a;Zero-Shot Intent Classification with Siamese Networks 通过零样本意图分类有效定位域外意图 2021 年 9 月 24 日 意图识别是面向目标对话系统的一项重要任务。意图识别(有时也称为意图检测)是使用标签对每个用户话语进行分类的任务&#xff0c;该标签…

网络编程学习

思维导图 代码练习 TCP实现通信 服务器端代码 #include <myhead.h> #define SER_IP "192.168.152.135" #define SER_PORT 8910 int main(int argc, const char *argv[]) {//&#xff11;创建用于监听的套接字int sfd -1;sfd socket(AF_INET,SOCK_STREAM,0)…

【mysql】 1819 - Your password does not satisfy the current policy requirements

创建mysql账户密码时候提示&#xff1a; 1819 - Your password does not satisfy the current policy requirements 1819-您的密码不符合当前策略要求 下面是执行的sql DROP DATABASE IF EXISTS company;CREATE DATABASE company CHARACTER SET utf8mb4 ;grant all on com…

VuePress + GitHub 搭建个人博客踩坑记录

最近想给我教练搭个网站,本来选的是 VuePress 框架,也折腾完了,起码是搭建出来了,踩的坑也都总结好了 但是最近发现了一个更简洁的模板: VuePress-theme-hope ,所以最终网站使用的样式是这个 不过我觉得这里面踩坑的记录应该还是有些价值的,分享出来,看看能不能帮到一些小伙伴~…

2000-2022年上市公司绿色专利申请占比/数据

2000-2022年上市公司绿色专利申请占比数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;国家知识产权局、WIPO绿色专利清单 3、指标&#xff1a;年份、股票代码、股票简称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、…

黑马瑞吉外卖练习笔记

day2 员工管理 完善登录 问题&#xff1a;用户不登录&#xff0c;直接访问系统首页&#xff0c;照样可以正常访问。我们希望&#xff0c;只有登录成功后才可以访问系统中的页面&#xff0c;如果没有登录则跳转到登录页面 怎么实现&#xff1f; 用过滤器或拦截器&#xff0c;在…

[数据结构 C++] AVL树的模拟实现

文章目录 1、AVL树1.1 AVL树的概念 2、AVL树节点的定义3、AVL树的插入和旋转3.1 左单旋左旋代码实现 3.2 右单旋右旋代码实现 3.3 右左双旋右左双旋的代码实现 3.4 左右双旋左右双旋的代码实现 3.5 insert接口实现 4、判断是否为AVL树判断AVL树的代码实现 5、AVL树的性能 问题引…

刷题第3天(简单题):LeetCode203--移除链表元素--虚拟头结点

LeetCode203:给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a;输入…