[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 1dpm,n1
  • 询问一张后手的牌,后手会将这张牌舍弃掉,然后后手变成先手,此时原来先手的胜率为 1 − d p m − 1 , n 1-dp_m-1,n 1dpm1,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+(1p)m+1m(1dpm1,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(1dpm,n1)+(1p)(m+1m(1dpm1,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+(1p)m+1m(1dpm1,n))=(1q)(p(1dpm,n1)+(1p)(m+1m(1dpm1,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+(1p)m+1m(1dpm1,n)=p(1dpm,n1)+(1p)(m+1m(1dpm1,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(1p)=w2,1p+w2,2(1p)可以得到 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,2w1,1w2,2w1,2w2,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

UI Design Do's and Don'ts

英语口语练习(1This is between you and me, Don't let it out. 2Don't let your dreams be dreams,

0HR_PT_2:Actual Time and Labor Times

(CF#257)B. Jzzhu and Sequences