D 和 V 的 博 弈 游 戏 D 和 V 的博弈游戏 D和V的博弈游戏
D
e
s
c
r
i
p
t
i
o
n
\mathcal{Description}
Description
S
o
l
u
t
i
o
n
\mathcal{Solution}
Solution
前言: 这道题目状态的转移及代码的实现都较为简单, 但是证明过程却并不是那么轻松… 也许是我太蒻了吧
这里先给出实现核心,具体可以先看后面详解.
设
m
a
x
_
v
[
i
]
,
m
i
n
_
v
[
i
]
表
示
i
为
根
的
子
树
,
D
a
v
i
d
,
V
a
n
所
能
取
得
的
各
自
的
最
优
值
.
设 max\_v[i], min\_v[i]\ 表示\ i\ 为根的子树, David,Van所能取得的各自的最优值.
设max_v[i],min_v[i] 表示 i 为根的子树,David,Van所能取得的各自的最优值.
注
:
m
a
x
_
v
[
i
]
表
示
在
i
子
树
中
D
a
v
i
d
能
取
到
第
m
a
x
_
v
[
i
]
大
的
数
,
表
排
名
.
注: max\_v[i]表示在\ i\ 子树中David能取到第max\_v[i]大的数,表排名.
注:max_v[i]表示在 i 子树中David能取到第max_v[i]大的数,表排名.
对给出的树执行
D
F
S
DFS
DFS, 设当前节点为
i
i
i,
t
o
∈
s
o
n
[
i
]
\ to ∈ son[i]
to∈son[i],
叶子节点 初值
m
a
x
_
v
[
i
]
=
m
i
n
_
v
[
i
]
=
1
,
max\_v[i]=min\_v[i]=1,
max_v[i]=min_v[i]=1,
-
i
为
D
a
v
i
d
点
i\ 为David点
i 为David点,
m a x _ v [ i ] = m a x ( m a x _ v [ t o ] ) max\_v[i]\ = max(max\_v[to]) max_v[i] =max(max_v[to])
m i n _ v [ i ] = ∑ t o ∈ s o n [ i ] m i n _ v [ t o ] min\_v[i] =\sum_{to ∈ son[i]} min\_v[to] min_v[i]=∑to∈son[i]min_v[to]
-
i
为
V
a
n
点
i\ 为Van点
i 为Van点,
m a x _ v [ i ] = ∑ t o ∈ s o n [ i ] m a x _ v [ t o ] max\_v[i]\ =\sum_{to ∈ son[i]} max\_v[to] max_v[i] =∑to∈son[i]max_v[to]
m i n _ v [ i ] = m i n ( m i n _ v [ t o ] ) min\_v[i]\ =\ min(min\_v[to]) min_v[i] = min(min_v[to])
接
下
来
是
详
细
的
解
答
过
程
:
接下来是详细的解答过程 :
接下来是详细的解答过程:
如
图
1
−
1
如图1-1
如图1−1, 重点说明当前节点为
V
a
n
Van
Van时如何操作,
I
.
情
况
:
\mathcal{I.} 情况 :
I.情况:
子
树
仅
包
括
叶
子
节
点
子树仅包括叶子节点
子树仅包括叶子节点
首先要明确:
从
树
上
任
意
节
点
出
发
向
下
,
最
后
必
定
到
达
子
节
点
全
部
是
叶
子
的
节
点
.
\color{red}{从树上任意节点出发向下,最后必定到达\ 子节点全部是叶子\ 的节点}.
从树上任意节点出发向下,最后必定到达 子节点全部是叶子 的节点.
也就是图中画
红
框
\color{red}{红框}
红框 的子树.
这个情况保证了 递归边界 的存在.
此时直接
m
a
x
_
v
[
i
]
=
m
i
n
_
v
[
i
]
=
1
max\_v[i]=min\_v[i]=1
max_v[i]=min_v[i]=1 即可, 对应上方的 初始化
I
I
.
情
况
:
\mathcal{II.} 情况 :
II.情况:
子
树
包
括
一
个
叶
子
节
点
和
一
个
D
节
点
子树包括一个叶子节点和一个 D 节点
子树包括一个叶子节点和一个D节点
设该叶子节点的值为
t
t
t, 最后取得
r
e
s
res
res, 考虑
V
a
n
Van
Van 如何走,
- 若 t = m a x t=max t=max, 则 V a n Van Van 必定会走 D D D 节点, r e s = m a x 次 res=max_次 res=max次.
- 若 t = m a x 次 t=max_次 t=max次, 此时 D D D 节点子树可以取得 m a x max max 值, 则 V a n Van Van 会往 t t t 走, r e s = m a x 次 res=max_次 res=max次
- 若 t = m i d t=mid t=mid, 此时 r e s = m i d res=mid res=mid.
根据列举的三种情况, 发现 若不将
t
t
t 的值置为
m
a
x
max
max, 则答案不会更优.
扩展到多个 叶子节点, 同理可得 红色字体成立.
I
I
I
.
情
况
:
\mathcal{III.} 情况 :
III.情况:
子
树
包
括
两
个
D
节
点
子树包括两个 D 节点
子树包括两个D节点
若
V
a
n
Van
Van 走了红节点, 必定是因为 走绿节点会使得
r
e
s
res
res 更大,
又因为绿节点中取得最大值
m
a
x
_
t
max\_t
max_t 时, 需要
m
a
x
_
t
−
1
max\_t-1
max_t−1 个结点将其
"
垫
上
去
"
\color{red}{"垫上去"}
"垫上去".
这也就说明了绿节点中所有的数值 比 红节点中 最大数值 要大,
进而说明 红节点 取得的最大数值在这颗子树中的排名为
m
a
x
_
v
[
绿
]
+
m
a
x
_
v
[
红
]
max\_v[绿]+max\_v[红]
max_v[绿]+max_v[红].
推广到含多个
D
D
D 节点的情况, 可以得出结论:
m
a
x
_
v
[
i
]
=
∑
t
o
∈
s
o
n
[
i
]
m
a
x
_
v
[
t
o
]
max\_v[i]\ =\sum_{to ∈ son[i]} max\_v[to]
max_v[i] =∑to∈son[i]max_v[to] ,
也就是上方的式子.
如果仔细观察, 可以发现
情
况
I
I
.
情况\mathcal{II.}
情况II. 与
情
况
I
I
I
.
情况\mathcal{III.}
情况III. 是可以看做同一类的,
因此简化转移的式子.
D a v i d David David 节点的处理方式与 V a n Van Van 的具有对称性, 这里不再赘述.
E N D END END.
C
o
d
e
\mathcal{Code}
Code