题目:这里有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