题目链接:Codeforces - Bag of mice
状态很好想,就是dp[i][j]表示,当前i只白,j只黑,先手获胜的概率。
怎么转移呢?
如果先手直接抓白,概率为:i/(i+j)
如果先手黑,后手白。因为算获胜概率,所以不管。
如果先手黑,后手黑,跑黑:
如果先手黑,后手黑,跑白:
只有这几种可能,直接转移即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e3+10;
double dp[N][N]; int w,b;
signed main(){
cin>>w>>b;
for(int i=1;i<=w;i++) dp[i][0]=1.0,dp[i][1]=i*1.0/(i+1);
for(int i=1;i<=w;i++){
for(int j=2;j<=b;j++){
dp[i][j]=1.0*i/(i+j);
dp[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];
if(j>=2)
dp[i][j]+=1.0*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;
}