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

DVD 和 V 的博弈游戏


Descriptionmathcal{Description}

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


Solutionmathcal{Solution}

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

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

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

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

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

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

11如图1-1, 重点说明当前节点为VanVan时如何操作,


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


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

  1. t=maxt=max, 则 VanVan 必定会走 DD 节点, res=maxres=max_次.
  2. t=maxt=max_次, 此时 DD 节点子树可以取得 maxmax 值, 则 VanVan 会往 tt 走, res=maxres=max_次
  3. t=midt=mid, 此时 res=midres=mid.

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


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

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

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

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

ENDEND.


Codemathcal{Code}


原文地址:https://www.cnblogs.com/zbr162/p/11822595.html