|
|
|
@ -92,22 +92,20 @@ NO
|
|
|
|
|
|
|
|
|
|
这个情况比较复杂,因为如果某个人把$1$减少$1$,那么这个堆同时也消失了,相当于操作数减少了$2$。
|
|
|
|
|
|
|
|
|
|
下面我们采用了动态规划的思想,用记忆化搜索来模拟演示一下:
|
|
|
|
|
|
|
|
|
|
$f[a][b]$ 表示当数量为$1$的堆有$a$个,剩下的堆的操作数是$b$的时候,先手是必胜还是必败,
|
|
|
|
|
f[a][b]=1 表示必胜,否则必败。$b$中不会出现数量为$1$的堆,除非只剩下一个堆了。
|
|
|
|
|
本题中可能存在一些堆的石子个数等于$1$:
|
|
|
|
|
* 假设有$a$堆石子,其中每堆石子个数为$1$
|
|
|
|
|
* 剩余堆的石子个数都严格大于$1$
|
|
|
|
|
|
|
|
|
|
情况1: 当a>=2的时候,合并两个数量为1的堆,这样就让b这边的操作数增加了2+(b>0),因为如果原来b大于0,相当于操作数增加了3,否则b原来是0,那么操作是只增加2.
|
|
|
|
|
情况2: 和a>0 并且b>0 的时候,我们可以合并一个数量为1的堆和b中一个数量不为1的堆,那么a减少1,b增加1
|
|
|
|
|
情况3:b>=2,我们合并b里面的两个堆或者减少1,无论哪种,都是让b里面的操作数减少1。
|
|
|
|
|
情况4: 当a>0的时候,我们可以减少一个数量为1的堆,这样a就减少1,b不变。
|
|
|
|
|
根据这些数量大于$1$的堆的石子可以求出上述定义出的$b$,我们使用$f(a, b)$表示此时先手必胜还是必败,因为博弈论在本质上是可以递推的,我们可以想出起点,再想出递推关系,就可以递推得到更大数据情况下的递推值,也就是博弈论本质上是$dp$。
|
|
|
|
|
|
|
|
|
|
<center><img src='https://cdn.acwing.com/media/article/image/2021/05/15/61813_30ead721b5-image-20210515211400052.png'></center>
|
|
|
|
|
|
|
|
|
|
另外有一种非常特殊的情况,就是$b$等于$1$了,刚才我们说了,$b$里面不会出现数量为$1$的堆,除非只剩下一个堆了。因为$b$里面只要堆的数量超过$1$,就一定可以用合并超过替代减少$1$操作,这样是等价的。
|
|
|
|
|
$Q:$**情况**$3$**为什么是两个表达式?**
|
|
|
|
|
答:
|
|
|
|
|
①当右侧存在时,合并左边两堆石子,则右侧多出一堆石子,并且,石子个数增加$2$,也就是$b+=3$
|
|
|
|
|
|
|
|
|
|
除非$b$里面只有一个堆了,那么我们就只能不断减少$1$了。
|
|
|
|
|
|
|
|
|
|
所以当$b$是$1$的时候,实际我们求的问题应该变成$f[a+1][0]$
|
|
|
|
|
②当右侧一个都没有的时候,左边送来了一堆,两个石子,按$b$的定义,是堆数+石子个数$-1=2$,即$b+=2$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 六、实现代码
|
|
|
|
|