题目描述
A君有
n
张牌,B君有
每个回合可以做两件事中的一件
- 猜测桌上的牌是什么,猜对则胜,猜败则输。
- 询问对方是否有某张牌,若有则需要将其示出,否则继续游戏。
A和B都很聪明,问A的胜率。
n,m<5000
分析
首先不到最后一刻是不会选择猜桌上的牌的。
假如某一次对方问了一张自己手上没有的牌,就可能会怀疑桌上的牌就是这张。
而询问对方是否有某张牌,我们可以选择询问自己手上有的牌,假如对方相信而去猜测这张牌的话就会输掉,我们称这样的行为作欺骗。
记
f(n,m)
表示先手有
n
张牌,后手有
那么就可以列一个表格,表示先手的选择以及后手的应对。
- 先手选择猜测对方的牌
- 后手认为先手在猜测,先手获胜的概率是 mm+1(1−f(m−1,n))
- 后手认为先手在欺骗,先手获胜的概率是 1m+1+mm+1(1−f(m−1,n))
- 先手选择欺骗
- 后手认为先手在猜测,先手获胜的概率是 1
- 后手认为先手在欺骗,先手获胜的概率是
1−f(n−1,m)
那么对于先手的任意一个策略,后手会选择最优的策略去使他输。也就是说假如先手用
p
的概率选择去猜测,
那么最终贡献的概率是
maxpmin{pmm+1(1−f(m−1,n))+(1−p),pm+1+pmm+1(1−f(m−1,n))+(1−p)(1−f(n−1,m))}
将
p
视为自变量,问题就转化为两条直线取
时间复杂度
O(nm)
空间复杂度
O(nm)