| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 动态规划课程树型dp例题 题解 -> 正文阅读 |
|
[数据结构与算法]动态规划课程树型dp例题 题解 |
动态规划课程树型dp例题 题解小G有一个大树题意给定一棵 n n n个节点的树,求树的重心。 思路
详细的定义可以看oi-wiki https://oi-wiki.org/graph/tree-centroid/ 维护每个节点
u
u
u的
s
z
sz
sz和
w
e
i
g
h
t
weight
weight分别表示:
u
u
u节点的子节点有多少个,以
u
u
u节点为根时最大的子树的节点数。 AC的代码
树上子链题意给定一颗有 n n n个节点的树,每个节点有一个权值 w i w_i wi?,求树上权值之和最大的一条链,并将这个权值之和输出。 思路设节点 u u u的子节点集合为 V = { v } V=\{v\} V={v},则经过节点 u u u并且由节点 u u u和 u u u的子树组成的最大权值链是 max ? i = 1 ∣ V ∣ { v a l [ v i ] } + S e c o n d ? max ? i = 1 ∣ V ∣ { v a l [ v i ] } + w [ u ] \max _{i=1}^{|V|}\{ val[v_i] \}+Second\ \max _{i=1}^{|V|}\{ val[v_i] \}+w[u] maxi=1∣V∣?{val[vi?]}+Second?maxi=1∣V∣?{val[vi?]}+w[u], v a l [ v i ] val[v_i] val[vi?]表示从 v i v_i vi?向下搜索能得到的最大权值,如下图。 遍历所有的节点 u u u,并更新答案。 AC的代码
吉吉王国题意给定一个 n n n个节点的树,根节点为 1 1 1,每条边有一个权值。 要删除若干条边(设这个被删边的集合为 S { e d g e } S\{edge\} S{edge}),使得原树中的叶子节点都被去掉,且删除的边的权值之和不超过 m m m, ∑ i = 1 ∣ S { e d g e } ∣ v a l [ i ] ≤ m \sum_{i=1}^{|S\{edge\}|}val[i] \le m ∑i=1∣S{edge}∣?val[i]≤m, v a l [ i ] val[i] val[i]表示第 i i i条边的权值。 问删除的边中的最大值的最小值是多少,即最小化 max ? i = 1 ∣ S { e d g e } ∣ v a l [ i ] \max_{i=1}^{|S\{edge\}|}val[i] maxi=1∣S{edge}∣?val[i]。 思路考虑二分答案, c h e c k ( k ) check(k) check(k)可以理解为所选边权不超过 k k k时,能否满足题目要求的两个条件:
如下图,假设节点 U U U有 3 3 3个子节点 V 1 , V 2 , V 3 V_1,V_2,V_3 V1?,V2?,V3?,其中 V 1 V_1 V1?和 V 2 V_2 V2?是叶子节点: 若
U
U
U要满足不和叶子节点相连,必须要把叶子节点
V
1
V_1
V1?和
V
2
V_2
V2?删掉,而对于
V
3
V_3
V3?来说,可以删除
U
?
V
3
U-V_3
U?V3?(当权值
≤
k
\le k
≤k时),也可以让
V
3
V_3
V3?满足不和叶子节点相连。 AC的代码
Rinne Loves Edges题意给定一棵有 n n n个节点、 m m m条边(每条边有一个权值)的树,并定义 s s s为关键点。 删除若干条边(设这个被删边的集合为 S { e d g e } S\{edge\} S{edge}),使得关键点不和树上的叶子节点相连,求被删除的边的权值之和的最小值, min ? ∑ i = 1 ∣ S { e d g e } ∣ v a l [ i ] \min \sum_{i=1}^{|S\{edge\}|}val[i] min∑i=1∣S{edge}∣?val[i]。 思路相当于上一题的简化版,可以先把上一题写了,再看这个。 基本思路不变,少了几个限制,直接转移就行了。 AC的代码
[USACO 2008 Jan G]Cell Phone Network题意给定一个 n n n个节点的树,现在要在若干个节点上建信号站,如果某一个点上有信号站,则这个点和相连的点都能收到信号。 问最少建多少个信号站。 思路最少点覆盖树的经典问题。 将一个点分成 3 3 3种状态:
然后考虑状态转移:
d p [ u ] [ 0 ] = 1 + ∑ v ∈ G [ u ] ? ∧ ? v ≠ f a min ? { d p [ v ] [ 0 ] , d p [ v ] [ 1 ] , d p [ v ] [ 2 ] } dp[u][0]=1+\sum_{v \in G[u]\ \wedge \ v\neq fa} \min\{dp[v][0],dp[v][1],dp[v][2]\} dp[u][0]=1+v∈G[u]?∧?v?=fa∑?min{dp[v][0],dp[v][1],dp[v][2]}
d p [ u ] [ 1 ] = ∑ v ∈ G [ u ] ? ∧ ? v ≠ f a min ? { d p [ v ] [ 0 ] , d p [ v ] [ 2 ] } dp[u][1]=\sum_{v \in G[u]\ \wedge \ v\neq fa} \min\{dp[v][0],dp[v][2]\} dp[u][1]=v∈G[u]?∧?v?=fa∑?min{dp[v][0],dp[v][2]}
d p [ u ] [ 2 ] = min ? k ∈ G [ u ] ? ∧ ? k ≠ f a { d p [ k ] [ 0 ] + ∑ v ∈ G [ u ] ? ∧ ? v ≠ f a ? ∧ ? v ≠ k min ? { d p [ v ] [ 0 ] , d p [ v ] [ 2 ] } } dp[u][2]=\min_{k \in G[u]\ \wedge \ k\neq fa} \{dp[k][0] + \sum_{v \in G[u]\ \wedge \ v\neq fa\ \wedge \ v\neq k} \min\{dp[v][0],dp[v][2]\}\} dp[u][2]=k∈G[u]?∧?k?=famin?{dp[k][0]+v∈G[u]?∧?v?=fa?∧?v?=k∑?min{dp[v][0],dp[v][2]}} ? 可以发现,这个式子后边的
∑
\sum
∑和
d
p
[
u
]
[
1
]
dp[u][1]
dp[u][1]的很像,可以将式子转化,从而降低计算的复杂度。 AC的代码
二叉苹果树题意给定一个有 n n n个节点且根节点为 1 1 1的树,树上每条边都有一个边权。 现在要减掉一些树枝,使得最后保留 q q q个树枝(树枝和根节点 1 1 1要连在一起)。 问保留的树枝权值之和最大为多少。 思路树上背包。 定义 d p [ i ] [ j ] dp[i][j] dp[i][j]为以 i i i节点为根节点的子树中,保留 j j j个树枝得到的最大权值。 状态转移方程为:(枚举 i , j i,j i,j) d p [ u ] [ i ] = m a x ( d p [ u ] [ i ] , d p [ u ] [ i ? j ? 1 ] + d p [ v ] [ j ] + w [ u ] [ v ] ) dp[u][i]=max(dp[u][i],dp[u][i-j-1]+dp[v][j] + w[u][v]) dp[u][i]=max(dp[u][i],dp[u][i?j?1]+dp[v][j]+w[u][v])。 AC的代码
没有上司的舞会题意给定一个有 n n n个节点的树,每个节点有一个权值,按照以下要求选出一些节点,使得权值和最大(注意权值有负数)。
思路当选中
u
u
u时,儿子节点一定不能选: d p [ u ] [ 0 ] = ∑ v ? i s ? a ? c h i l d ? n o d e ? o f ? u max ? ( d p [ v ] [ 0 ] , d p [ v ] [ 1 ] ) dp[u][0] = \sum_{v\ is\ a\ child\ node \ of\ u} \max(dp[v][0], dp[v][1]) dp[u][0]=v?is?a?child?node?of?u∑?max(dp[v][0],dp[v][1]) AC的代码
Strategic game题意给定一个有 n n n个节点的树,选定一些点定义为关键点,使得每一条边的两端至少有一个关键点。 思路经典题目,可以先把[USACO 2008 Jan G]Cell Phone Network补了,再看这个。 当没选中
u
u
u时,儿子节点必须选: AC的代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/9 1:14:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |