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

我们先来看几个比较简单的例子来引入:

我们令f[i]表示以i为根节点的子树大小,易得状态转移方程为:

f[i]=1+f[son1]+....+f[soni];

我们用DFS即可,下面是大致的模板:

让我们来看看几道题吧:

1.贪心+树形DP+DFS:

对于叶子节点,它要多少就弄多少,然后我们再分析它的父亲节点,假如它的子树还缺,那么就选其子树上最小的值即可。

因此,我们维护好每一个子树的min,然后再DFS一下各个子树所需的数量即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;int n,t[100010],head[100010],cnt,p,root,min1[100010];
long long sum=0,c[100010];
struct node{int dian,next;
}edge[100010];
void merge(int x,int y){edge[++cnt].dian=y;edge[cnt].next=head[x];head[x]=cnt;
}
int dfsmin(int root){if(head[root]==-1){min1[root]=t[root];return t[root];}min1[root]=t[root];for(int i=head[root];i!=-1;i=edge[i].next){min1[root]=min(dfsmin(edge[i].dian),min1[root]);}return min1[root];
}
long long dfssum(int root){if(head[root]==-1){sum+=c[root]*min1[root];return c[root];}long long ckck=0;for(int i=head[root];i!=-1;i=edge[i].next){ckck+=dfssum(edge[i].dian);}if(ckck<c[root]){sum+=(c[root]-ckck)*min1[root];ckck=c[root];}return ckck;
}
int main(){memset(head,-1,sizeof(head));cin>>n;for(int i=1;i<=n;i++){scanf("%d%d%d",&p,&c[i],&t[i]);if(p==-1){root=i;continue;}merge(p,i);}dfsmin(root);dfssum(root);cout<<sum;
} 

接题:

我们要求的即为一个点,当他删去后要让形成的树中节点最多的尽量小。

我们考虑一个点删去,它的儿子形成树,它的父亲节点以上也形成了树。

于是,我们令f[i]为删去i后最大联通快的大小,

f[i]=max(tot[k],n-tot[i]),tot为树的大小,用树形dp维护即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,head[1010],x,y,cnt,sum[1010],inc[1010],root,f[1010];
struct node{int dian,next;
}edge[1005];
void merge(int x,int y){edge[++cnt].dian=y;edge[cnt].next=head[x];head[x]=cnt;
}
int dfssum(int root){if(head[root]==-1){return sum[root]=1;}sum[root]=1;for(int i=head[root];i!=-1;i=edge[i].next){sum[root]+=dfssum(edge[i].dian);}return sum[root];
}
int main(){cin>>n;memset(head,-1,sizeof(head));for(int i=1;i<=n-1;i++){cin>>x>>y;merge(x,y);inc[y]++;}for(int i=1;i<=n;i++){if(inc[i]==0){root=i;break;}}dfssum(root);int ans=1000000,ans1,jj;for(int i=1;i<=n;i++){int ckck=-1;for(int j=head[i];j!=-1;j=edge[j].next){ckck=max(ckck,sum[edge[j].dian]);}ans1=max(ckck,n-sum[i]);if(ans1<ans){ans=ans1;jj=i;}}cout<<jj<<" "<<ans;
}

接题:

我们令f[i][0]表示i节点不选时它和它的子树快乐最大指数,f[i][1]表示i节点选时它和它的子树快乐最大指数,因此,我们得到状态转移方程为:

f[i][0]=\summax(f[j][0],f[j][1])

f[i][1]=hi+\sum f[j][0]

f[ri][0]=0,f[ri][1]=hri(ri为叶子节点)

结果就是max(f[root][0],f[root][1]).

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,head[6010],cnt,inc[6010],x,y,root,dp[6010][2],h[6010],pos[6010][2];
struct node{int dian,next;
}edge[6010];
void merge(int x,int y){edge[++cnt].dian=y;edge[cnt].next=head[x];head[x]=cnt;
}
int dfs(int root,int k){if(pos[root][k]==1) return dp[root][k];if(k==1){dp[root][k]=h[root];for(int i=head[root];i!=-1;i=edge[i].next){dp[root][k]+=dfs(edge[i].dian,0);}}else{for(int i=head[root];i!=-1;i=edge[i].next){dp[root][k]+=max(dfs(edge[i].dian,0),dfs(edge[i].dian,1));}}pos[root][k]=1;return dp[root][k];
}
int main(){memset(head,-1,sizeof(head));cin>>n;for(int i=1;i<=n;i++) cin>>h[i];for(int i=1;i<=n-1;i++){cin>>x>>y;merge(y,x);inc[x]++;}cin>>x>>y;for(int i=1;i<=n;i++){if(inc[i]==0){root=i;break;}}int jj=dfs(root,1);int gg=dfs(root,0);cout<<max(jj,gg);
}

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

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

相关文章

多输入时序预测|GWO-CNN-LSTM|灰狼算法优化的卷积-长短期神经网络时序预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 灰狼优化算法&#xff1a; 卷积神经网络-长短期记忆网络&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容…

【教程】 iOS混淆加固原理篇

目录 摘要 引言 正文 1. 加固的缘由 2. 编译过程 3. 加固类型 1) 字符串混淆 2) 类名、方法名混淆 3) 程序结构混淆加密 4) 反调试、反注入等一些主动保护策略 4. 逆向工具 5. OLLVM 6. IPA guard 7. 代码虚拟化 总结 摘要 本文介绍了iOS应用程序混淆加固的缘由…

oracle官网下载早期jdk版本

Java Downloads | Oracle JDK Builds from Oracle 以上压缩版&#xff0c;以下安装版 Java Downloads | Oracle 该链接往下拉能看到jdk8和jdk11的安装版 -- end

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

STM32--低功耗模式详解

一、PWR简介 正常模式与睡眠模式耗电是mA级&#xff0c;停机模式与待机模式是uA级。 二、电源框图 供电区域有三处&#xff0c;分别是模拟部分供电&#xff08;VDDA&#xff09;&#xff0c;数字部分供电&#xff0c;包括VDD供电区域和1.8V供电区域&#xff0c;后备供电&…

StarRocks之监控管理(内含DashBoard模板)

先看下最终效果图 架构 Prometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。它可以通过 Pull 或 Push 采集被监控系统的监控项,存入自身的时序数据库中。并且通过丰富的多维数据查询语言,满足用户的不同需求。 Grafana 是一个开源的 Metric 分析及可视化系…

Oracle 基础表管理(Heap-Organized Table Management)

表是数据库中负责数据存储的对象&#xff0c;在RDBMS中&#xff0c;数据以行、列的形式存储在表中。Oracle中表有很多种类型&#xff0c;最基础且应用最常用的类型就是堆表&#xff08;Heap-Organized Table&#xff09;&#xff0c;本文列举了Oracle堆表的常用管理操作。 一、…

【GPTs分享】GPTs分享之consensus

大家好&#xff0c;元宵节快乐&#xff0c;今天给大家分享的GPTs是consensus。consensu号称无需关键字即可搜索2亿文章&#xff0c;而且给出的链接绝对保真&#xff0c;不再是胡编乱造的&#xff0c;而且能够根据指定主题辅助编写论文或者博客。 简介 consensus使用chat.cons…

案例分析|山西某光伏发电站轨道巡检机器人解决方案

随着光伏发电技术的不断发展&#xff0c;光伏变电站配电室作为能量转换和输送的关键节点&#xff0c;承担着重要的电力分配和保护功能。然而&#xff0c;传统的人工巡检方式存在诸多问题&#xff0c;如巡检周期长、效率低、安全风险高等&#xff0c;已经无法满足光伏变电站配电…

解决Maven爆红以及解决 Idea 卡在 Resolving问题

关于 Idea 卡在 Resolving&#xff08;前提是Maven的setting.xml中配置好了阿里云和仓库&#xff09; 参考文章https://blog.csdn.net/jiangyu1013/article/details/95042611 解决Maven爆红参考文章https://devpress.csdn.net/beijing/656d993b76f0791b6eca7bb0.html?dp_toke…

hcia datacom课程学习(1):通信基础

1.总体框架 上图为发送方通过互联网传递信息给接收方的过程。 家用路由器会直接集成上图中的四层&#xff08;vlan&#xff0c;DHCP&#xff0c;静态路由&#xff0c;NAT&#xff0c;PPPoE&#xff09;。 2.网络性能指标 &#xff08;1&#xff09;带宽 单位时间内传输的数…

vue项目打包获取git commit信息并输出到打包后的指定文件夹中

需求背景&#xff1a; 前端项目经常打包&#xff0c;发包部署&#xff0c;为了方便测试及运维发现问题时与正确commit信息对比 实现方式&#xff1a; 使用Node.js的child_process模块来执行git命令 实现步骤&#xff1a; 1.在package.json的同级目录下新建一个version.js文件。…

GEE入门篇|遥感专业术语(实践操作4):光谱分辨率(Spectral Resolution)

目录 光谱分辨率&#xff08;Spectral Resolution&#xff09; 1.MODIS 2.EO-1 光谱分辨率&#xff08;Spectral Resolution&#xff09; 光谱分辨率是指传感器进行测量的光谱带的数量和宽度。 您可以将光谱带的宽度视为每个波段的波长间隔&#xff0c;在多个波段测量辐射亮…

LeetCode刷题--- 环形子数组的最大和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

C++ 使用ZLIB库中的MiniZip实现目录压缩与解压

文章目录 1、C 使用ZLIB库中的MiniZip实现递归目录压缩2、C 使用ZLIB库中的MiniZip实现递归目录解压缩3、使用过程遇到的问题 1、C 使用ZLIB库中的MiniZip实现递归目录压缩 Zlib是一个开源的数据压缩库&#xff0c;提供了一种通用的数据压缩和解压缩算法。它最初由Jean-Loup G…

在Ubuntu系统下搭建TDengine集群

目录 一、Ubuntu虚拟机创建 二、系统相关配置 1、设置系统hostname 2、网络配置及IP规划 3、配置FQDN&#xff08;etc/hosts&#xff09; 4、服务端口设置 三、TDengine server安装 1、服务安装 2、修改配置 3、启动taosd 4、服务卸载 四、客户端安装 1、client安…

Jmeter系列(2)目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前&#xff0c;需要先对工具的目录有些了解&#xff0c;也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

大语言模型推理加速技术:计算加速篇

原文&#xff1a;大语言模型推理加速技术&#xff1a;计算加速篇 - 知乎 目录 简介 Transformer和Attention 瓶颈 优化目标 计算加速 计算侧优化 KVCache Kernel优化和算子融合 分布式推理 内存IO优化 Flash Attention Flash Decoding Continuous Batching Page…

车载测试面试:题库+项目

车载测试如何面试&#xff08;面试技巧&#xff09;https://blog.csdn.net/2301_79031315/article/details/136229809 入职车载测试常见面试题(附答案&#xff09;https://blog.csdn.net/2301_79031315/article/details/136229946 各大车企面试题汇总&#xff08;含答案&…

深搜+素数筛,LeetCode 2867. 统计树中的合法路径数目

一、题目 1、题目描述 给你一棵 n 个节点的无向树&#xff0c;节点编号为 1 到 n 。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi] 表示节点 ui 和 vi 在树中有一条边。 请你返回树中的 合法路径数目 。 如果在节点 a 到节点 …