题意:原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠。谁先抓到白色老鼠谁就赢。 王妃每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。 每次抓老鼠和跑出来的老鼠都是随机的。 如果两个人都没有抓到白色老鼠则龙赢。王妃先抓。 问王妃赢的概率。
思路:用dp[i][j]表示剩下i只白鼠和j只黑鼠时公主赢的概率,那么我们可以得到状态转移方程
首先,如果在这种状态下公主直接抓到白鼠那么她胜的概率是i/(i+j)
其次,如果她这次抓的是黑鼠,那么如果想要公主胜,那么龙也必须抓的是黑鼠
这时又分成了两种情况,黑鼠逃脱和白鼠逃脱,转移分别为
dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];
dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3]
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<ctime>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
double dp[1100][1100];
int main() {
//freopen("input.txt", "r", stdin);
int w, b;
while(scanf("%d%d", &w, &b) == 2) {
for(int i = 1; i <= w; i++) dp[i][0] = 1;
for(int i = 0; i <= b; i++) dp[0][i] = 0;
for(int i = 1; i <= w; i++) {
for(int j = 1; j <= b; j++) {
dp[i][j] = (double)i/(i+j);
if(j>=2) dp[i][j] += (double)j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];
if(j>=3) dp[i][j] += (double)j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
}
}
printf("%.10lf\n", dp[w][b]);
}
return 0;
}