Problem - 148D - Codeforces
i == 0 全是黑鼠 , A 必败
dp[i][j] == 0
j == 0 全是白鼠 , A 必胜
dp[i][j] == 1
分四种情况:
1. A 取到白鼠 dp[i][j] += i / (i + j)
2. A 取到黑鼠 , B取到白鼠 dp[i][j] += 0;
3. A 取到黑鼠 , B取到黑鼠 , 白鼠跑出来 dp[i][j] += j / (i + j) * (j - 1) / (i + j - 1) * i / (i + j - 2) * dp[i - 1][j - 2]
4. A 取到黑鼠 , B取到黑鼠 , 黑鼠跑出来 dp[i][j] += j / (i + j) * (j - 1) / (i + j - 1) * (j - 2) / (i + j - 2) * dp[i][j - 3]
#include
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 1e3 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;
double dp[N][N];
int x , y;
inline double pro(int x , int y){
return (double) x / (double) y;
}
signed main(){
IOS
cout << fixed << setprecision(10);
cin >> x >> y;
for(int i = 1 ; i <= x ; i ++) dp[i][0] = 1;
for(int i = 1 ; i <= y ; i ++) dp[0][i] = 0;
for(int i = 1 ; i <= x ; i ++){
for(int j = 1 ; j <= y ; j ++){
dp[i][j] += pro(i , i + j);
if(i >= 1 && j >= 2) dp[i][j] += pro(j , i + j) * pro(j - 1 , i + j - 1) * pro(i , i + j - 2) * dp[i - 1][j - 2];
if(j >= 3) dp[i][j] += pro(j , i + j) * pro(j - 1 , i + j - 1) * pro(j - 2 , i + j - 2) * dp[i][j - 3];
}
}
cout << dp[x][y];
return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);