main
黄海 2 years ago
parent bb796bcd90
commit f342487278

@ -47,30 +47,32 @@ NO
### 二、博弈论总结
<font size=4 color='red'><b>
必胜态 $\Rightarrow$ 选择合适方案 $\Rightarrow$ 必败态
必败态 $\Rightarrow$ 选择任何路线 $\Rightarrow$ 必胜态
</b></font>
必胜态 $\Rightarrow$ 选择合适方案 $\Rightarrow$ 对手必败态
必败态 $\Rightarrow$ 选择任何路线 $\Rightarrow$ 对手必胜态
</b></font>
### 三、简单情况
为什么会想到讨论简单情况呢?我们来思考一下:如果某一堆石子只有$1$个,随着我们执行拿走$1$个的操作,它的堆就没了,这样石子个数变了,堆数也变了,两个变量,问题变复杂了,我们上来就想难题,怕是搞不定。
既然这样,我们就思考一下 **子空间** :只考虑所有个数大于等于$2$的那些堆,其它可能存在石子数等于$1$的,等我们想明白这个简单问题再研究扩展的事,由易到难。
对手聪明绝顶,不会犯错误,一旦他有机会获胜,他一定能找到合适的方案!所以,一定不能让他有机会,也就是总要让他总是处于必败状态,你才能获胜!
同时,我们需要思考博弈的胜负与什么因素相关呢?因为只有两种操作:**拿走一个石子、合并两堆**,很显然,**两个关键因素:石子个数、堆数**
### 三、思考过程
同时,两个操作同一时间只能执行一个,所以可以理解为拿走一个石子对结果影响一下,合并两堆石子对结果也是影响一下,初步考虑应该堆个数与石子总数的加法关系相关。
**$Q1$:本题中博弈的胜负与什么因素相关呢?**
**答**:因为只有两种操作:**拿走一个石子、合并两堆**,很显然, 两个关键因素: **石子个数、堆数**
**$Q2$:一般情况是什么,特殊情况是什么呢?**
**答**:如果某一堆石子只有$1$个,随着我们执行拿走$1$个的操作,它的堆就没了,这样石子个数变了,堆数也变了,一下变两个,问题变复杂了,上来就想难题,怕是搞不定。
既然这样,我们就思考一下 **一般情况** :只考虑所有个数大于等于$2$的那些堆,其它可能存在石子数等于$1$的,等我们想明白这个一般情况问题再研究特殊情况的事,由易到难。
**$Q3$:猜一下关联关系?**
两个操作同一时间只能执行一个,可以理解为拿走一个石子对结果影响一下,合并两堆石子对结果也是影响一下,初步考虑应该堆个数与石子总数的加法关系相关。
**子空间:当每堆的石子个数都是大于等于$2$时**
**一般情况:当每堆的石子个数都是大于等于$2$时,猜的关联关系**
<font size=5 color='red'><center><b>设$b$ = 堆数 + 石子总数 - $1$</b></center></font>
<font size=5 color='red'><center><b>结论:$b$是奇数⟺先手必胜,$b$是偶数⟺先手必败</b></center></font>
**证明:**
1、边界当我们只有一堆石子且该堆石子个数为$1$个时,$b=1$,先手必胜。
1、**特殊情况**:当我们只有一堆石子且该堆石子个数为$1$个时,$b=1$,先手必胜。
2、当$b$为奇数,一定可以通过某种操作将$b$变成偶数
* 如果堆数大于$1$,合并两堆让$b$变为偶数
* 如果堆数等于$1$,从该堆石子中取出一个就可以让$b$变为偶数
@ -138,16 +140,7 @@ $Q1:$**情况**$3$**为什么是两个表达式?**
②当右侧一个都没有的时候,左边送来了一堆,两个石子,按$b$的定义,是堆数+石子个数$-1=2$,即$b+=2$
$Q2$**为什么用一个奇数来描述简单情况的状态,而不是用偶数呢?**
答:因为要通过递推式进行计算,最终的边界是需要我们考虑的:
- 如果用奇数,那么边界就是$b=1$,表示只有$1$堆,石子数量只有$1$个,此时当然必胜。
- 如果用偶数,比如边界是$b=0$,表示目前$0$堆,$0$个石子,这都啥也没有了,还必胜态,不符合逻辑,说不清道不明。
- 那要是不用$b=0$做边界,用$b=2$呢?表示只有$1$堆,石子数量只有$1$个,这个应该也是可以,但没有再仔细想了。
$Q3:$**情况**$2$**从右边取一个石子,如果此时右侧存在某一堆中石子个数是$2$,取走$1$个后,变成了$1$,不就是右侧减少了一个堆,减少了两个石子,即$b-=3$;同时,此堆石子个数变为$1$,左侧个数$a+=1$,为什么没有看到这个状态变化呢?**
$Q2:$**情况**$2$**从右边取一个石子,如果此时右侧存在某一堆中石子个数是$2$,取走$1$个后,变成了$1$,不就是右侧减少了一个堆,减少了两个石子,即$b-=3$;同时,此堆石子个数变为$1$,左侧个数$a+=1$,为什么没有看到这个状态变化呢?**
答:<font color='red' size=4><b>这是因为聪明人不会从右侧某个石子数量大于$2$的堆中取走石子!</b></font>
@ -227,71 +220,3 @@ int main() {
return 0;
}
```
思路: 我们可以简单猜想当总操作数
a
[
i
]
+
n
1
是奇数的时候,先手必胜。 但事实并非如此,有些情况并不成立 。 我们可以发现当n是1的时候这样结论显然成立。
另外我们还可以总结出当没有数量为1的石子堆时这个结论也是成立的。 下面我们先来证明这个结论。
猜想: 当没有数量为1的堆上面和是奇数的时候先手必胜如果是偶数先手必败。
1. 先证明奇数必胜对于先手来说如果n>1那么只要选两堆合并 那么总操作数变成偶数n=1明显只能选择减少1操作后手还是偶数。对于后手来说无论他是减少1,还是合并操作,留下的总操作数一定还是奇数。
对于某些读者来说可能会问如果后手把某个2变成1,先手该怎么办其实这个很容易操作如果堆数超过1,先手一定选择合并这个数量为1的堆如果只有一堆了而且还是1,明显先手必胜了。 所以,先手总是有办法让
后手必败(操作数为偶数的局面),后手无论怎么走,都会让先手必胜(变成操作为奇数的局面),所以我们证明成立。
2. 在上面,我们也证明了当操作数是偶数的时候,先手是必败的。
接下来我们考虑有数量为1的堆的时候的情况这个情况比较复杂因为如果某个人把1减少1,那么这个堆同时也消失了相当于操作数减少了2。
由于数据规模不是很大,我们采用了动态规划的思想,用记忆化搜索来实现情况。
f
[
a
]
[
b
]
表示当数量为1的堆有a个剩下的堆的操作数是b的时候先手是必胜还是必败
f
[
a
]
[
b
]
=
1
表示必胜否则必败。b中不会出现数量为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
情况3b>=2,我们合并b里面的两个堆或者减少1无论哪种都是让b里面的操作数减少1。
情况4 当a>0的时候我们可以减少一个数量为1的堆这样a就减少1,b不变。
另外有一种非常特殊的情况就是b等于1了刚才我们说了b里面不会出现数量为1的堆除非只剩下一个堆了。因为b里面只要堆的数量超过1,就一定可以用合并超过替代减少1操作这样是等价的。
除非b里面只有一个堆了那么我们就只能不断减少1了。
所以当b是1的时候实际我们求的问题应该变成f[a+1][0]
以上内容是我自己的一个总结,网上有些题解感觉写的不是很清楚,我自己理了一下思路,重新写了一个题解。
Loading…
Cancel
Save