【题目链接】
http://codeforces.com/contest/148/problem/D
【算法】
概率DP
f[w][b]表示还剩w只白老鼠,b只黑老鼠,公主胜利的概率,那么 :
1. 公主抓到白老鼠,概率为w/(w+b)
2. 公主抓到黑老鼠,那么龙也抓到黑老鼠,如果跑出来的老鼠是白颜色的,则概率为 : b / (w + b) * b / (w + b - 1) * w / (w + b - 2) * f[w-1][b-2]
否则,概率为 : b / (w + b) * (b - 1) / (w + b - 1) * (b - 2) / (w + b - 2) * f[w][b-3]
【代码】
#include<bits/stdc++.h> using namespace std; int i,j,w,b; double f[1010][1010]; double dp(int w,int b) { if (w < 0 || b < 0) return 0; if (f[w][b] != -1) return f[w][b]; if (w == 0) return f[w][b] = 0; if (w == 1 && b == 0) return f[w][b] = 1; f[w][b] = 1.0 * w / (w + b); if (w >= 1 && b >= 2) f[w][b] += 1.0 * b / (w + b) * (b - 1) / (w + b - 1) * w / (w + b - 2) * dp(w-1,b-2); if (b >= 3) f[w][b] += 1.0 * b / (w + b) * (b - 1) / (w + b - 1) * (b - 2) / (w + b - 2) * dp(w,b-3); return f[w][b]; } int main() { scanf("%d%d",&w,&b); for (i = 0; i <= w; i++) { for (j = 0; j <= b; j++) { f[i][j] = -1; } } printf("%.9lf ",dp(w,b)); return 0; }