【博弈论】关于蒙蒂霍尔问题(三门问题)的讨论
洛谷期中考试的第三题,思维型非常强,其来源就是美国的三门问题,又称:蒙蒂霍尔问题或山车问题。
三门问题的原型是这样的:
「假设你正在参加一个游戏节目,你被要求在三扇门中选择一扇: 其中一扇后面有一辆车;其余两扇后面则是山羊。 你选择了一道门,假设是一号门,然后知道门后面有什么的主持人, 开启了另一扇后面有山羊的门,假设是三号门。 他然后问你:“你想选择二号门吗?”转换你的选择对你来说是一种优势吗?」
如果是按照人的【直觉】的话,肯定是每个门有车的概率都是1/3啊,所以换不换都一样。
没错,我一开始也是这么想的,但是如果是这样,那为什么还要把这种题放到NOIP的提高组里。实际上,上面的那种【直觉】是错误的,完全错误的!
再推了一大张打草纸后,发现对于这个问题,每次当主持人告诉你其中的一个错误选项后,你做出的觉得必须要换,换对你来说是一种优势。
我们可以这么开看待这个问题:
1.当前选择的那个门,有汽车的概率是33%,另外两个门有汽车的概率是66%。 【到这里没问题吧,神奇的在下面】
2.主持人告诉你另外两个门中有一个门没有汽车,那那个门就可以扔掉了,那剩下的那个门,拥有汽车的概率就66%。【是不是?是不是这样看,转换是有优势的!】
接下来,对于该问题进行推广,推广到OI中:
题目描述
Bob 正在考试,他遇到了一个奇怪的选择题:这个选择题共有 n个选项,其中只有一个选项是正确的。他完全不会做这题,所以只能靠蒙。
蒙这道题分为 n−2n轮,在第 1 轮开始之前,Bob 会在这 n 个选项中随机蒙一项,之后的每轮流程如下:首先,Alice 会过来帮他排除一个选项,由于 Alice 事先知道答案,所以她会在现有的除正确的那一项和 Bob 正在选的那一项外的选项里,随机删去一个。之后,Bob 可以选择是否更换自己蒙的选项,如果更换,则随机更换到除正在选的那一项之外的任意一项。
Bob 在这 n−2n 轮中,由于和 Alice 达成的神秘协定,需要恰好更换 kkk 次选项。他想知道,如何更换,使得自己蒙对的概率最大,输出这个概率。为了方便,你需要输出这个概率的分数形式在模 109+710^9 + 7 意义下的结果。
前k-1次更换选项,最后1次更换选项的机会要留到最后。可以推出递归式,然后解答即可。
代码实现:
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MOD = (int)1e9 + 7; int fexp(int a, int b) { int res = 1; for(int i = 1; i <= b; i <<= 1) { if(i & b) res = 1LL * res * a % MOD; a = 1LL * a * a % MOD; } return res; } int inv(int x) { return fexp(x, MOD - 2); } int f[MAXN], g[MAXN]; int main() { int n, k; scanf("%d %d", &n, &k); if(k == 0) { printf("%lld\n", 1LL * inv(n) % MOD); } else if(k == 1) { printf("%lld\n", 1LL * (n - 1) * inv(n) % MOD); } else { puts("GG"); } return 0; }