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

博客围绕D和V的博弈游戏展开,指出题目状态转移和代码实现较简单,但证明过程较难。给出了以i为根的子树中David和Van各自最优值的表示及DFS执行规则,还详细分析了当前节点为Van时不同子树情况的操作,最后说明David节点处理方式与之对称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


Description\mathcal{Description}Description

在这里插入图片描述在这里插入图片描述


Solution\mathcal{Solution}Solution

前言: 这道题目状态的转移及代码的实现都较为简单, 但是证明过程却并不是那么轻松… 也许是我太蒻了吧

这里先给出实现核心,具体可以先看后面详解.

设max_v[i],min_v[i] 表示 i 为根的子树,David,Van所能取得的各自的最优值.设 max\_v[i], min\_v[i]\ 表示\ i\ 为根的子树, David,Van所能取得的各自的最优值.max_v[i],min_v[i]  i ,David,Van.
注:max_v[i]表示在 i 子树中David能取到第max_v[i]大的数,表排名.注: max\_v[i]表示在\ i\ 子树中David能取到第max\_v[i]大的数,表排名.:max_v[i] i Davidmax_v[i],.

对给出的树执行 DFSDFSDFS, 设当前节点为 iii,  to∈son[i]\ to ∈ son[i] toson[i],
叶子节点 初值 max_v[i]=min_v[i]=1,max\_v[i]=min\_v[i]=1,max_v[i]=min_v[i]=1,

  1. i 为David点i\ 为David点i David,
    max_v[i] =max(max_v[to])max\_v[i]\ = max(max\_v[to])max_v[i] =max(max_v[to])
    min_v[i]=∑to∈son[i]min_v[to]min\_v[i] =\sum_{to ∈ son[i]} min\_v[to]min_v[i]=toson[i]min_v[to]
  2. i 为Van点i\ 为Van点i Van,
    max_v[i] =∑to∈son[i]max_v[to]max\_v[i]\ =\sum_{to ∈ son[i]} max\_v[to]max_v[i] =toson[i]max_v[to]
    min_v[i] = min(min_v[to])min\_v[i]\ =\ min(min\_v[to])min_v[i] = min(min_v[to])

接下来是详细的解答过程:接下来是详细的解答过程 ::

如图1−1如图1-111, 重点说明当前节点为VanVanVan时如何操作,


I.情况:\mathcal{I.} 情况 :I.: 子树仅包括叶子节点子树仅包括叶子节点
首先要明确: 从树上任意节点出发向下,最后必定到达 子节点全部是叶子 的节点.\color{red}{从树上任意节点出发向下,最后必定到达\ 子节点全部是叶子\ 的节点}.,  .
也就是图中画 红框\color{red}{红框} 的子树.
这个情况保证了 递归边界 的存在.
此时直接 max_v[i]=min_v[i]=1max\_v[i]=min\_v[i]=1max_v[i]=min_v[i]=1 即可, 对应上方的 初始化


II.情况:\mathcal{II.} 情况 :II.: 子树包括一个叶子节点和一个D节点子树包括一个叶子节点和一个 D 节点D
设该叶子节点的值为 ttt, 最后取得 resresres, 考虑 VanVanVan 如何走,

  1. t=maxt=maxt=max, 则 VanVanVan 必定会走 DDD 节点, res=max次res=max_次res=max.
  2. t=max次t=max_次t=max, 此时 DDD 节点子树可以取得 maxmaxmax 值, 则 VanVanVan 会往 ttt 走, res=max次res=max_次res=max
  3. t=midt=midt=mid, 此时 res=midres=midres=mid.

根据列举的三种情况, 发现 若不将 ttt 的值置为 maxmaxmax, 则答案不会更优.
扩展到多个 叶子节点, 同理可得 红色字体成立.


III.情况:\mathcal{III.} 情况 :III.: 子树包括两个D节点子树包括两个 D 节点D
VanVanVan 走了红节点, 必定是因为 走绿节点会使得 resresres 更大,
又因为绿节点中取得最大值 max_tmax\_tmax_t 时, 需要 max_t−1max\_t-1max_t1 个结点将其 "垫上去"\color{red}{"垫上去"}"".
这也就说明了绿节点中所有的数值 比 红节点中 最大数值 要大,
进而说明 红节点 取得的最大数值在这颗子树中的排名为 max_v[绿]+max_v[红]max\_v[绿]+max\_v[红]max_v[绿]+max_v[].

推广到含多个 DDD 节点的情况, 可以得出结论: max_v[i] =∑to∈son[i]max_v[to]max\_v[i]\ =\sum_{to ∈ son[i]} max\_v[to]max_v[i] =toson[i]max_v[to] ,
也就是上方的式子.

如果仔细观察, 可以发现 情况II.情况\mathcal{II.}II.情况III.情况\mathcal{III.}III. 是可以看做同一类的,
因此简化转移的式子.

DavidDavidDavid 节点的处理方式与 VanVanVan 的具有对称性, 这里不再赘述.

ENDENDEND.


Code\mathcal{Code}Code


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值