[「一本通 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)
\]
发现这样的状态改变就相当于先合并,在取一个石子。是被包含的。那么原操作就没有意义。
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号