备战蓝桥杯---树形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.mzph.cn/news/705511.shtml

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

相关文章

提升Java IO性能!深入掌握FilterOutputStream类!

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java IO相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

FX110网:2024年1月六大机构货币现货交易量数据出炉

2024年1月&#xff0c;各主要平台的机构货币现货交易量呈半升半降态势&#xff0c;但降幅超过涨幅&#xff0c;六大交易场所的现货日均货币交易量&#xff08;ADV&#xff09;平均环比为-1.42%。其中&#xff0c;Cboe FX、360T和Saxo Bank环比下跌&#xff1b;Euronext FX、FxS…

2024龙年特别篇 -- 魔法指针 之 二级指针 指针数组

哈喽哈喽&#xff0c;它来咯&#xff0c;它来咯&#xff0c;接下来有白子寰给你讲解:二级指针 指针数组 目录 二级指针 二级指针的介绍 一图 KO 二级指针 二级指针的运算 指针数组 概念 指针数组模拟二维数组 整形指针数组 二级指针 二级指针的介绍 在介绍时&#xff0…

网络安全与IP安全网络安全

网络安全与IP安全网络安全 网络安全 是指网络系统的硬件&#xff0c;软件以及系统中的数据收到的保护。 保护的基本属性为&#xff1a;机密性&#xff0c;身份认证&#xff0c;完整性和可用性&#xff1b; 基本特征&#xff1a;相对性&#xff0c;时效性&#xff0c;相关性…

如何操作系统缓冲区减少了磁盘碎片化?

如何操作系统缓冲区减少了磁盘碎片化&#xff1f; 在探讨操作系统如何通过使用缓冲区来减少磁盘碎片化之前&#xff0c;我们需要先了解什么是磁盘碎片化以及它为什么会对我们的电脑性能造成影响。 磁盘碎片化简介 磁盘碎片化发生在计算机硬盘上存储数据的过程中。简单来说&am…

一文解读MES软件为企业带来的五大好处,附功能亮点及应用场景

在当今激烈竞争的市场环境下&#xff0c;企业需要不断提升自身的灵活性和适应能力&#xff0c;以更好地应对各种挑战和变化。而MES软件作为一种重要的信息化工具&#xff0c;可以帮助企业提升生产管理水平&#xff0c;提高效率&#xff0c;实现精细化管理&#xff0c;从而增强企…

jQuery引入及下载方法

jQuery引入及下载方法 目录 jQuery引入及下载方法【方法1】cdn引入【方法2】下载本地文件 【方法1】cdn引入 直接在head引入jq <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title>&…

【C++】7-12 样本方差

7-12 样本方差 分数 10 全屏浏览 切换布局 作者 ldm 单位 成都信息工程大学 作为概率论随便考100分的你&#xff0c;口算出给定样本的方差自然也不在话下&#xff0c;不过今天需要你编程实现这样的程序。 样本方差&#xff1a;S2n−11​∑i1n​(Xi​−Xˉ)2 样本均值&…

【BUG 记录】史诗级 BUG - MYSQL 删库删表却没有备份如何恢复数据

【BUG 记录】史诗级 BUG - MYSQL 删库删表却没有备份如何恢复数据 1. 问题描述2. 解决方案&#xff08;binlog&#xff09;2.1 构造测试环境2.2 查看 MySQL 环境是否开启 binlog2.3 查看所有的 binlog 日志记录2.4 查看当前正在使用的是哪一个 binlog 文件2.5 查看此时的 binlo…

好书推荐丨AI绘画全面精通:软件平台+脚本文案+设计制作+案例实战

文章目录 写在前面AI绘画推荐图书图书简介本书特色作者简介 推荐理由粉丝福利写在后面 写在前面 本期博主给大家带来了一本全新出版的AI绘画类书籍&#xff0c;《AI绘画全面精通&#xff1a;软件平台脚本文案设计制作案例实战》&#xff0c;对人工智能感兴趣的小伙伴快来看看吧…

uniapp+express前后端小程序获取头像和昵称和code,openid,小程序授权登陆最新教程

目录 0总体思路0.1前端实现&#xff1a;0.2如何阻拦一些页面必须要登陆才能进去呢&#xff1f;0.3后端实现 1.首页2.个人中心页3.授权登陆页3.1.获取微信头像和微信昵称3.1.1官方教程3.1.2实际实现 3.2.获取头像和昵称之后去获取code小程序授权登陆3.3登陆页的整体代码&#xf…

【Leetcode每日一题】二分查找 - 寻找峰值(难度⭐⭐)(20)

1. 题目解析 Leetcode链接&#xff1a;162. 寻找峰值 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到题目中所说的峰值并返回他们的下标即可。 2. 算法原理 分析峰顶及其两旁数据的特点 峰顶数据特点&#xff1a;峰…

windows 11+docker desktop+grafana+influxDB+python写入

下载安装docker desktop 出现WSL相关的错误。WSL是一个linux内核的子系统&#xff0c;docker是基于linux内核的&#xff0c;所以运行docker需要WSL。 以管理员权限打开powershell&#xff0c;查看WSL状态 wsl --status 我遇到的错误是因为我关闭了windows的某些更新 执行上…

Android自定义View实现数字密码锁

最近项目上用到一个密码加锁功能&#xff0c;需要一个数字密码界面&#xff0c;就想着封装成一个View来方便管理和使用。 废话不多说&#xff0c;先上最终效果图&#xff1a; 思路 整体可分为2个部分来实现&#xff0c;1.顶部是4个密码位的填充&#xff1b;2.数字键盘部分。整…

VUE基础知识九 ElementUI项目

ElementUI官网 一 项目 最终完成的效果&#xff1a; 切换上边的不同按钮&#xff0c;下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后&#xff0c;引入ElementUI&#xff08;搭建、引入ElementUI步骤在第七节里已…

旧衣服回收小程序开发:企业、创业者收益新模式

近年来&#xff0c;我国旧衣回收行业发展迅速。随着大众对衣物的更新需求增加&#xff0c;闲置衣物便也不断增加&#xff0c;我国的旧衣回收行业的市场规模随之增加。 当下&#xff0c;旧衣回收产业链较为完善&#xff0c;主要以出口为主&#xff0c;回收利润较高。与其他行业…

【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(1)

1.model.py import torch.nn as nn import torch.nn.functional as F引入pytorch的两个模块 关于这两个模块的作用&#xff0c;可以参考下面 Pytorch官方文档 torch.nn包含了构成计算图的基本模块 torch,nn.function包括了计算图中的各种主要函数&#xff0c;包括&#…

python Matplotlib Tkinter--pack 框架案例

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 版本一 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox…

优思学院|精益生产管理在中国的发展前景

在这个快速变化的世界里&#xff0c;有一个管理理念悄然崛起&#xff0c;它就是精益生产。 这个概念最早由詹姆斯P沃麦克、丹尼尔T琼斯和丹尼尔鲁斯在他们的著作《改变世界的机器》中提出&#xff0c;后来在丰田汽车公司的成功实践中得到了广泛的认可。 这本书不仅风靡全球&a…

Springboot中如何记录好日志

Springboot中如何记录日志 日志体系整体介绍 日志一直在系统中占据这十分重要的地位&#xff0c;他是我们在系统发生故障时用来排查问题的利器&#xff0c;也是我们做操作审计的重要依据。那么如何记录好日志呢&#xff1f;选择什么框架来记录日志&#xff0c;是不是日志打越…