【博弈论】关于蒙蒂霍尔问题(三门问题)的讨论

洛谷期中考试的第三题,思维型非常强,其来源就是美国的三门问题,又称:蒙蒂霍尔问题或山车问题。

三门问题的原型是这样的:

「假设你正在参加一个游戏节目,你被要求在三扇门中选择一扇:
其中一扇后面有一辆车;其余两扇后面则是山羊。
你选择了一道门,假设是一号门,然后知道门后面有什么的主持人,
开启了另一扇后面有山羊的门,假设是三号门。
他然后问你:“你想选择二号门吗?”转换你的选择对你来说是一种优势吗?」

如果是按照人的【直觉】的话,肯定是每个门有车的概率都是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;
}

 

 

posted @ 2018-08-31 17:20  virtualman  阅读(2211)  评论(0编辑  收藏  举报