D 和 V 的博弈游戏 [思维题]

36 篇文章 0 订阅
4 篇文章 0 订阅

D 和 V 的 博 弈 游 戏 D 和 V 的博弈游戏 DV


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 Davidmax_v[i],.

对给出的树执行 D F S DFS DFS, 设当前节点为 i i i,   t o ∈ s o n [ i ] \ to ∈ son[i]  toson[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,

  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]=toson[i]min_v[to]
  2. 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] =toson[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 11, 重点说明当前节点为 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 如何走,

  1. 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.
  2. 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
  3. 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_t1 个结点将其 " 垫 上 去 " \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] =toson[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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值