您的位置:首页 > 其它

[Codeforces148D]Bag of mice(概率dp)

2017-03-13 20:35 218 查看

题目描述

传送门

题意:一个袋子里有w只白老鼠和b只黑老鼠,有两个人轮流抓老鼠,每个人每次都等概率地抓出一只老鼠,第二个人抓完之后袋子里会等概率地跳出来一只老鼠,第一个抓到白老鼠的人获胜。问第一个人获胜的概率

题解

令f(i,j)表示袋子里总共用i只老鼠,并且j只为白老鼠的概率

根据剩余老鼠的数量可以判断出第几个人抓或者老鼠往外跳

那么当第一个人或者第二个人抓的时候,f(i,j)从f(i+1,j)转移过来(因为一旦有人抓到白老鼠就获胜了,游戏结束)

当老鼠往外蹦的时候,f(i,j)从f(i+1,j)和f(i+1,j+1)转移过来

然后对于每一个第一个人抓的时候计算一下概率就行了

注意特判一下0的情况

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

int w,b,n;
double f[2005][2005],ans;

int main()
{
scanf("%d%d",&w,&b);n=w+b;
if (!w)
{
printf("%.10lf\n",ans);
return 0;
}
f
[w]=1.0;ans+=f
[w]*((w+0.0)/(n+0.0));
for (int i=n-1;i>=0;--i)
for (int j=min(w,i);j>=0;--j)
{
int k=i-j,minus=(n-i)%3;
if (minus<=1) f[i][j]=f[i+1][j]*((k+1.0)/(i+1.0));
else f[i][j]=f[i+1][j+1]*((j+1.0)/(i+1.0))+f[i+1][j]*((k+1.0)/(i+1.0));

if (!minus&&i) ans+=f[i][j]*((j+0.0)/(i+0.0));
}
printf("%.10lf\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: