Codeforces Round #105 D. Bag of mice 機率dp,
http://codeforces.com/contest/148/problem/D
題目意思是龍和公主輪流從袋子裡抽老鼠,袋子裡有白老師 W 只,黑老師 D 只,公主先抽,第一個抽出白老鼠的勝利,龍每次抽的時候會隨機跑出一隻老鼠。給出W和D要你求出公主勝利的機率。
對於dp[w][d]表示有w只白老鼠d只黑老鼠的情況下公主勝利的機率,如果公主第一次就抽出白鼠,機率是 w/(w+d) ,而如果公主沒有抽到白鼠,要讓公主勝利,龍也不能抽到白鼠,則是 rec = d/(w+d) * (d-1)/(w+d-1) 。這是跑出來的老鼠可能是白的也可能是黑的。如果是白鼠,則剩下w-1隻白鼠d-2隻黑鼠,然後再公主先手,機率是rec * w/(w+d-2) * dp[w-1][d-2]。 如果是黑鼠,則剩下w只白鼠d-3隻黑鼠,同樣公主先手,機率是rec * (d-2)/(w+d-2) * dp[w][d-3];
最終得dp轉移方程:
dp[i][j] = i / (i+j) + rec * (i / (i+j-2) * dp[i-1][j-2] + (j-2) / (i + j - 2) * dp[i][j-3]);
rec = j / (i + j) * (j - 1) / (i + j - 1);
/*********************************************** ** problem ID : cf_#105D.cpp ** create time : Wed Jul 22 20:22:24 2015 ** auther name : xuelanghu ** auther blog : blog.csdn.net/xuelanghu407 **********************************************/#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n, m;double dp[1010][1010];int main () { cin >> n >> m; for (int i=0; i<=n; i++) { dp[i][0] = 1.0; } for (int i=0; i<=m; i++) { dp[0][i] = 0.0; } for (int i=1; i<=n; i++) { dp[i][1] = (double)i / (i+1); for (int j=2; j<=m; j++) { dp[i][j] = (double)i / (i+j); double tmp = (double)j* (double)(j-1) / (i+j) / (i+j-1); if (j>2) dp[i][j] += tmp * (double)(j-2) / (i+j-2) * dp[i][j-3]; dp[i][j] += tmp * (double)i / (i+j-2) * dp[i-1][j-2]; } } printf("%.10lf\n", dp[n][m]); return 0;}code
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。