袋中 w 白鼠、b 黑鼠。公主、龍輪流摸鼠,公主先摸。摸到白鼠者勝。龍摸完後會隨機跑掉一隻鼠 (不算摸中)。求公主勝率。w,b ≤ 1000。
**公主回合 (win):**
**龍回合 (lose):**
#include
#include
using namespace std;
double win[1005][1005], lose[1005][1005];
int main() {
int w, b;
while (~scanf("%d%d", &w, &b)) {
for (int i = 0; i <= w; i++) {
for (int j = 0; j <= b; j++) {
win[i][j] = lose[i][j] = 0;
}
}
for (int i = 1; i <= w; i++) win[i][0] = 1.0;
for (int i = 1; i <= w; i++) {
for (int j = 1; j <= b; j++) {
double total = i + j;
// 公主回合
win[i][j] = i / total; // 摸白
win[i][j] += (j / total) * lose[i][j-1]; // 摸黑
// 龍回合
if (j >= 1) {
double pDragonBlack = j / total;
double remTotal = total - 1;
if (remTotal > 0) {
// 跑白
if (i >= 1) lose[i][j] += pDragonBlack * (i / remTotal) * win[i-1][j-1];
// 跑黑
if (j >= 2) lose[i][j] += pDragonBlack * ((j-1) / remTotal) * win[i][j-2];
}
}
}
}
printf("%.9f\n", win[w][b]);
}
return 0;
}