[CF98E]Help Shrek and Donkey
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF98E]Help Shrek and Donkey相关的知识,希望对你有一定的参考价值。
Help Shrek and Donkey
题解
这又是什么鬼畜博弈游戏。
我们先记
d
p
i
,
j
dp_i,j
dpi,j表示先手有
i
i
i张牌,后手有
j
j
j张牌的时先手的胜率。
此时先手直接猜牌时,获胜的概率为
1
m
+
1
\\frac1m+1
m+11
此时先手提出询问,则会有三种情况,
- 询问一张自己有的牌,这种时候就是在迷惑后手,让后手以为这张可能是正确的牌,如果后手信了的话,那么先手就必胜;否则就相当于舍弃掉了这张牌,因为到下一个先手的回合先手不能因此去获胜,所以后手肯定可以知道先手有这张牌,而后手变成先手,于是胜率就别成了 1 − d p m , n − 1 1-dp_m,n-1 1−dpm,n−1。
- 询问一张后手的牌,后手会将这张牌舍弃掉,然后后手变成先手,此时原来先手的胜率为 1 − d p m − 1 , n 1-dp_m-1,n 1−dpm−1,n。
- 询问正确的牌,此时后手如果认为先手没有诈自己,那么后手必胜;否则先手下回合就可以猜这张牌,先手必胜。
显然先手是没办法主观上区别情况2与情况3,所以当先手不选择情况1时,就有
m
m
+
1
\\fracmm+1
m+1m的概率进入情况2与
1
m
+
1
\\frac1m+1
m+11的概率进入情况3,我们设先手有
p
p
p的概率选择情况1。
而对于后手,他是没办法主观上区分情况1与情况3的,所以他此时选择相信先手与不相信先手的概率应该是固定的,我们设后手有
q
q
q的概率相信先手。
当后手选择相信先手时,先手的胜率是
p
+
(
1
−
p
)
m
m
+
1
(
1
−
d
p
m
−
1
,
n
)
p+(1-p)\\fracmm+1(1-dp_m-1,n)
p+(1−p)m+1m(1−dpm−1,n)。
当后手选择不信先手时,先手的胜率是
p
(
1
−
d
p
m
,
n
−
1
)
+
(
1
−
p
)
(
m
m
+
1
(
1
−
d
p
m
−
1
,
n
)
+
1
)
p(1-dp_m,n-1)+(1-p)(\\fracmm+1(1-dp_m-1,n)+1)
p(1−dpm,n−1)+(1−p)(m+1m(1−dpm−1,n)+1)
由于后手不知道先手时怎么选择的,但后手 绝顶聪明,他可以算出先手的
p
p
p,所以后手绝对会去平衡这两个概率,使得这两个的代权加和最小。
q
(
p
+
(
1
−
p
)
m
m
+
1
(
1
−
d
p
m
−
1
,
n
)
)
=
(
1
−
q
)
(
p
(
1
−
d
p
m
,
n
−
1
)
+
(
1
−
p
)
(
m
m
+
1
(
1
−
d
p
m
−
1
,
n
)
+
1
)
)
q(p+(1-p)\\fracmm+1(1-dp_m-1,n))=(1-q)(p(1-dp_m,n-1)+(1-p)(\\fracmm+1(1-dp_m-1,n)+1))
q(p+(1−p)m+1m(1−dpm−1,n))=(1−q)(p(1−dpm,n−1)+(1−p)(m+1m(1−dpm−1,n)+1))容易观察到,经过后手的平衡,先手的胜率肯定是趋近于两种情况中较小的一个的。
但我们的先手也是绝顶聪明的呀,他肯定不会让后手去决定他的概率,所以他肯定会先通过
p
p
p使得自己的两个概率都是一样的,免得后手选择较小的一个。
显然,这两边是一加一减的,如果两边都同增同减了,那么先手就别玩了,所以平衡后,所以通过先手的平衡,较小的一个肯定提高了,显然最好的情况是两个概率一样,这时候可以使得较小的概率最大。
也就是说,有
p
+
(
1
−
p
)
m
m
+
1
(
1
−
d
p
m
−
1
,
n
)
=
p
(
1
−
d
p
m
,
n
−
1
)
+
(
1
−
p
)
(
m
m
+
1
(
1
−
d
p
m
−
1
,
n
)
+
1
)
p+(1-p)\\fracmm+1(1-dp_m-1,n)=p(1-dp_m,n-1)+(1-p)(\\fracmm+1(1-dp_m-1,n)+1)
p+(1−p)m+1m(1−dpm−1,n)=p(1−dpm,n−1)+(1−p)(m+1m(1−dpm−1,n)+1)存在。
但这个表达式也太烦琐了,我们先将它换一下。
w
1
,
1
p
+
w
1
,
2
(
1
−
p
)
=
w
2
,
1
p
+
w
2
,
2
(
1
−
p
)
w_1,1p+w_1,2(1-p)=w_2,1p+w_2,2(1-p)
w1,1p+w1,2(1−p)=w2,1p+w2,2(1−p)可以得到
p
=
w
1
,
2
−
w
2
,
2
w
2
,
1
+
w
1
,
2
−
w
1
,
1
−
w
2
,
2
p=\\fracw_1,2-w_2,2w_2,1+w_1,2-w_1,1-w_2,2
p=w2,1+w1,2−w1,1−w2,2w1,2−w2,2,这样就算出了我们先手的
p
p
p。
有了
p
p
p,我们当然就可以求出我们的
d
p
n
,
m
dp_n,m
dpn,m了,从这两个中随便选一个算就可以,反正两个值都是一样的。
之后不过是不断地
d
p
dp
dp下去,整个问题就都能够通过
d
p
dp
dp解决,可以通过记忆化搜索实现。
时间复杂度
O
(
n
m
)
O\\left(nm\\right)
O(nm)。
实际上该问题是一种典型的纳什博弈,也就是进行选择后两种概率是一样的。
源码
代码事实上很短。
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define CF98EHelp Shrek and Donkey
CF28D Don't fear, DravDe is kind
英语口语练习(1This is between you and me, Don't let it out. 2Don't let your dreams be dreams,