dp[i][j]表示剩余总数为i,且白老鼠数目为j时的概率。
令s=w+b,则有初始概率dp[s][w]=1
公主回合转移为dp[i-1][j]=dp[i]*(i-j)/i,即取到黑鼠的概率,同时统计当前状态公主取到白鼠的概率。
龙回合抽取时转移同样为dp[i-1][j]=dp[i][j],老鼠逃跑时,转移为
dp[i-1][j]+=dp[i][j]*(i-j)/i
dp[i-1][j-1]=dp[i][j]*j/i
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int w,b;
double dp[MAXN*2][MAXN];
int main(){
cin>>w>>b;
int s=w+b;
bool f=1;
double ans=0;
dp[s][w]=1;
for(int i=s;i>=1;){
if(f){//princess round
for(int j=min(i,w);j>=1;j--){
ans+=dp[i][j]*j/i;
dp[i-1][j]=dp[i][j]*(i-j)/i;
}
i--;
}
else{//dragon round
for(int j=min(i,w);j>=1;j--){
dp[i-1][j]=dp[i][j]*(i-j)/i;
}
i--;
for(int j=min(i,w);j>=1;j--){
dp[i-1][j]+=dp[i][j]*(i-j)/i;
dp[i-1][j-1]=dp[i][j]*j/i;
}
i--;
}
f=!f;
}
printf("%.12f\n",ans);
return 0;
}