[「一本通 6.7 练习 3」取石子]题解

「一本通 6.7 练习 3」取石子

首先。我们考虑所有的石子个数都是大于 1 的,那么我们可以做两种操作。

  • 合并两堆石子。
  • 删掉某一堆中的一个石子。
    假设这些堆的石子个数总和为 \(s\),假设这里有 \(c\) 堆,那么总共可以操作的次数是 \(s + c - 1\)
    它的奇偶性就决定了谁能够赢。
    那么我们自然的想到 DP:
    \(dp_{i,j}\) 表示有 \(i\) 堆为 1 的石堆,我们称为一类堆,\(j\) 堆大于 1 的石堆,我们称为二类堆。它的必胜态。1 表示必胜,反之必败。
    然后我们有一下五种操作:
  • \(dp_{i-1,j}\to dp_{i,j}\)(删掉某一个一类堆中石子)。
  • \(dp_{i-1,j+1}\to dp_{i,j}\)(合并一个一类堆和二类堆)。
  • \(dp_{i,j-1}\to dp_{i,j}\) (删掉二类堆中的石子)。
  • \(dp_{i-1,1}\to dp_{i,0}\) (等价的,如果二类堆的石子只能操作一次了就是一类堆)。
  • \(dp_{i,j}\to dp_{i-2,j+2+1[j \ne 0]}\),(合并两个一类堆,如果有二类堆可以多一次合并)。
    这里可能有一个疑问,为什么不可以删掉二类堆中的一个大小为 2 的堆,从而使得:

\[dp_{i,j}\to dp_{i+1,j-1} \]

我们发现在上述五个式子中只有第 4 个式子考虑了 \(j=1\) ,也就是只有一堆的时候的这种情况。
为什么在多堆的二类堆时不需要这么转移呢。
因为考虑如果有多堆。你把一个二类堆变成了一类堆。那么我们一定还有剩二类堆。
对方仍然可以将一类堆与二类堆合并。状态经过了这样的改变。

\[(i,j)\longrightarrow (i+1,j-3)\longrightarrow (i,j-2) \]

发现这样的状态改变就相当于先合并,在取一个石子。是被包含的。那么原操作就没有意义。

posted @ 2024-03-20 09:21  weirdoX  阅读(111)  评论(0)    收藏  举报