题目大意: 有 n n n 个白球 m m m 个黑球,AB 两人轮流抽,谁抽到白球谁赢,但是B抽完后还会跑掉一个球,问A赢的概率。
题解
一开始代码码错了,结果两个错的地方凑在一起还AC了,搞的我迷惑了好久……
跑掉的球你也可以看成有一个第三人C抽了一手,然后很容易列出dp方程, f [ i ] [ j ] f[i][j] f[i][j] 表示还剩 i i i 个白球 j j j 个黑球时,A的获胜概率。
对于一组确定的 i , j i,j i,j,此时操作方也是确定的,根据操作方来dp即可,具体看代码吧,不难理解:
#include <cstdio>
int n,m,A,B,C;
double f[1010][1010];
int main()
{
scanf("%d %d",&n,&m);
A=(n+m)%3;B=(A+2)%3;C=(B+2)%3;
for(int i=1;i<=n;i++)if(i%3!=B)f[i][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if((i+j)%3==A)f[i][j]=1.0*i/(i+j)+1.0*j/(i+j)*f[i][j-1];
if((i+j)%3==B)f[i][j]=1.0*j/(i+j)*f[i][j-1];
if((i+j)%3==C)f[i][j]=1.0*i/(i+j)*f[i-1][j]+1.0*j/(i+j)*f[i][j-1];
}
printf("%.9lf",f[n][m]);
}