Bag of mice

题目:这里有w只白鼠和b只黑鼠,龙和王妃轮流从袋子里抓鼠,每次抓一只,抓到第一只白鼠的人获胜。当龙抓一只鼠时,袋子里会跑掉一只鼠,跑掉的鼠是等概率的。问王妃获胜的概率。

 思路:设有i只白鼠j只黑鼠的状态下王妃获胜的概率是dp[i][j]。

王妃在i,j情况下取得一只白鼠获胜,概率为i/(i+j);

王妃没有取到白鼠,取黑鼠的概率是j/(i+j),若王妃要赢,下次龙一定取黑鼠,概率为(j-1)/(i+j-1),同时跑掉的是黑鼠,概率为(j-2)/(i+j-2),状态转移到dp[i][j-3];
王妃没有取到白鼠,取黑鼠的概率是j/(i+j),若王妃要赢,下次龙一定取黑鼠,概率为(j-1)/(i+j-1),同时跑掉的是白鼠,概率为i/(i+j-2),状态转移到dp[i-1][j-2];

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<stack>
 7 #include <bitset>
 8 #include<set>
 9 #include<map>
10 #include<vector>
11 #include<cmath>
12 #include<string>
13 using namespace std;
14 #define maxn 1e3;
15 // i只白鼠j只黑鼠的状态下王妃获胜的概率是dp[i][j]
16 double dp[1005][1005];
17 int main() {
18     int w, b;
19     cin >> w >> b;
20     memset(dp, 0, sizeof(dp));
21     for (int i = 1; i <= w; i++) {
22         dp[i][0] = 1;
23     }
24     for (int i = 0; i <= b; i++) {
25         dp[0][i] = 0;
26     }
27     for (int i = 1; i <= w; i++) {
28         for (int j = 1; j <= b; j++) {
29             dp[i][j] = i * 1.0 / (i + j);
30             if (j >= 2) { // 在王妃第一次抓黑鼠后,龙又抓黑鼠 ,跑掉了白鼠
31                 dp[i][j] += 1.0 *j / (i + j) * (1.0 * (j - 1) / (i + j - 1)) * (1.0 * i / (i + j - 2)) * dp[i - 1][j - 2];
32             }
33             if (j >= 3) {//  跑掉黑鼠
34                 dp[i][j] += 1.0 * j / (i + j) * (j - 1) * 1.0 / (i + j - 1) * (j - 2) * 1.0 / (i + j - 2) * dp[i][j - 3];
35             }
36         }
37     }
38     printf("%.9lf
", dp[w][b]);
39     return 0;
40 }

 链接:https://blog.csdn.net/u013081425/article/details/39084275

原文地址:https://www.cnblogs.com/0211ji/p/13336114.html