0
点赞
收藏
分享

微信扫一扫

A - Bag of mice(概率dp)

南陵王梁枫 2022-03-13 阅读 37


题目来源:https://cn.vjudge.net/contest/322917


 题意:开始有w只白鼠,b只黑鼠,公主先手,龙后手开始抽不放回的抽样实验。谁先抽到白鼠谁就赢了。如果龙抽了一次后,就会有一只鼠逃出实验箱,每次老鼠逃出的概率是相等的;。

解析: 设dp[i][j]表示如今轮到王妃抓时有i仅仅白鼠,j仅仅黑鼠。王妃赢的概率 明显 dp[0][j]=0,0<=j<=b;由于没有白色老鼠了 dp[i][0]=1,1<=i<=w;由于都是白色老鼠,抓一次肯定赢了。 dp[i][j]能够转化成下列四种状态:

1、王妃抓到一仅仅白鼠,则王妃赢了,概率为i/(i+j);

2、王妃抓到一仅仅黑鼠。龙抓到一仅仅白色,则王妃输了。概率为j/(i+j)*i/(i+j-1).

3、王妃抓到一仅仅黑鼠,龙抓到一仅仅黑鼠。跑出来一仅仅黑鼠,则转移到dp[i][j-3]。 概率为j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2);

4、王妃抓到一仅仅黑鼠,龙抓到一仅仅黑鼠。跑出来一仅仅白鼠。则转移到dp[i-1][j-2]. 概率为j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2);

当然后面两种情况要保证合法。即第三种情况要至少3仅仅黑鼠,第四种情况要至少2仅仅白鼠

【代码】

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
const int N=1e3+10;
double dp[N][N];
int main()
{
int w,b;
cin>>w>>b;
int mx=max(w,b);
rep(i,1,w)dp[i][0]=1;
for(int i=1;i<=w;++i)
{
for(int j=1;j<=b;++j)
{
dp[i][j]+=((double)i)/(i+j);
if(j>=3) dp[i][j]+=(1.0*j/(i+j)*(1.0*j-1)/(i+j-1)*(1.0*j-2)/(i+j-2))*dp[i][j-3];
if(j>=2) dp[i][j]+=(1.0*j/(i+j)*(1.0*j-1)/(i+j-1)*1.0*i/(i+j-2))*dp[i-1][j-2];
}
}
printf("%.9f\n",dp[w][b]);
}



举报

相关推荐

0 条评论