Files
python/TangDou/Topic/【树上背包】专题.md
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

499 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

TODO
挖坑待填
https://blog.csdn.net/yingxue_cat/article/details/133648992
树上背包
发现这个也不会。枯。希望现学来得及吧。
P2014 [CTSC1997] 选课
虽然以前写过,但似乎是没咋看懂式子稀里糊涂敲上去的(?
啊啊啊以前好多这种稀里糊涂照着题解思路/老师代码贺上去的题,每当提起我都记得做过,每当考到就发现不会,深受其害/ll
这题是个森林,则对每棵树的根节点向 0
0
连边,使之变成一棵树。
设 fi,j,k
<EFBFBD>
<EFBFBD>
,
<EFBFBD>
,
<EFBFBD>
表示子树 i
<EFBFBD>
的前 j
<EFBFBD>
个儿子,已经选了 k
<EFBFBD>
门课的最大值。注意:必须选点 i
<EFBFBD>
那么 fnow,tot,j=max(fnow,tot,j,fnow,tot−1,j−k+fv,mxtot,k)
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
,
<EFBFBD>
<EFBFBD>
<EFBFBD>
,
<EFBFBD>
=
max
(
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
,
<EFBFBD>
<EFBFBD>
<EFBFBD>
,
<EFBFBD>
,
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
,
<EFBFBD>
<EFBFBD>
<EFBFBD>
−
1
,
<EFBFBD>
−
<EFBFBD>
+
<EFBFBD>
<EFBFBD>
,
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
,
<EFBFBD>
)
。同样注意 k
<EFBFBD>
只能循环到 j−1
<EFBFBD>
−
1
。
类似背包进行滚动数组优化。(似乎滚动了反而更好写(?)
也不知道自己到底会没会/kk
P4516 [JSOI2018] 潜入行动
题面看起来还挺套路,但我不会,树形 dp 是真忘光了啊啊啊啊啊怎么办
式子好长不想写...算了口胡一下吧。
设 dp[u][j][0/1][0/1]
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
/
1
]
[
0
/
1
]
表示子树 u
<EFBFBD>
里放了 j
<EFBFBD>
个,点 u
<EFBFBD>
放了/没放,是否已经被监听。
于是滚动数组一下推出长下面这样的转移柿子↓
↓
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪dp[x][i+j][0][0]=∑dp[x][i][0][0]×dp[v][j][0][1]dp[x][i+j][1][0]=∑dp[x][i][1][0]×(dp[v][j][0][0]+dp[v][j][0][1])dp[x][i+j][0][1]=∑(dp[x][i][0][1]×(dp[v][j][0][1]+dp[v][j][1][1])+dp[x][i][0][0]×dp[v][j][1][1])dp[x][i+j][1][1]=∑(dp[x][i][1][0]×(dp[v][j][1][0]+dp[v][j][1][1])+dp[x][i][1][1]×(dp[v][j][0][0]+dp[v][j][0][1]+dp[v][j][1][0]+dp[v][j][1][1]))
{
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
+
<EFBFBD>
]
[
0
]
[
0
]
=
∑
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
0
]
×
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
1
]
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
+
<EFBFBD>
]
[
1
]
[
0
]
=
∑
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
0
]
×
(
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
0
]
+
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
1
]
)
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
+
<EFBFBD>
]
[
0
]
[
1
]
=
∑
(
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
1
]
×
(
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
1
]
+
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
1
]
)
+
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
0
]
×
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
1
]
)
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
+
<EFBFBD>
]
[
1
]
[
1
]
=
∑
(
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
0
]
×
(
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
0
]
+
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
1
]
)
+
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
1
]
×
(
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
0
]
+
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
0
]
[
1
]
+
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
0
]
+
<EFBFBD>
<EFBFBD>
[
<EFBFBD>
]
[
<EFBFBD>
]
[
1
]
[
1
]
)
)
卡 long long 空间,要强制类型转换。我不管,我胡了就是我写了!(确信
不知道啥题
OI wiki 为什么给我推黑题啊,不会/kk
所以写到这吧awa
树形 DP
范学长讲树上问题,顺路回来更新一波。
CF822F Madness
贪心题。胡了篇 lg 题解。
P2607 [ZJOI2008] 骑士
基环树上的 dp。第一次做这种题(?
对于每个基环树,dfs 找到环的那条边,对于这条边分别钦定 u
<EFBFBD>
不选/v
<EFBFBD>
不选,分别 dp 即可。
转移显然。
实现的时候写麻烦了,直接并查集判环就可以,不用 dfs。