题面

这是我做的第一道概率DP题;

做完后发现没有后效性的DP是真的水;

在这里说主要是再捋顺一下思路;

设f[i][j]表示有i只白鼠,j只黑鼠是获胜的概率;

显然:f[i][0]=1;

然后分四种情况:

1.先手刚好拿到白鼠:概率是i/(i+j);

2.先手拿到黑鼠,后手拿到了白鼠:概率为0;

3.先手拿到了黑鼠,后手拿到了也黑鼠,并且跑的是白鼠:概率是::dp[i][j]=j/(i+j)∗(j−1)/(i+j−1)∗i/(i+j−2)∗dp[i−1][j−2];

4.先手拿到了黑鼠,后手拿到了也黑鼠,并且跑的是黑鼠:概率是:dp[i][j]=j/(i+j)∗(j−1)/(i+j+1)∗(j−2)/(i+j−2)∗dp[i][j−3];

然后就可以AC掉了;

#include <bits/stdc++.h>
using namespace std;
double f[1010][1010];
int main()
{
	int w,b;
	scanf("%d%d",&w,&b);
	for(register int i=1;i<=w;i++){
		f[i][0]=1;
		for(register int j=1;j<=b;j++){
			f[i][j]=(double)i/(double)(i+j);
		}
	}
	for(register int i=1;i<=w;i++){
		for(register int j=1;j<=b;j++){
			if(j>=2) f[i][j]=f[i][j]+(double)(f[i-1][j-2]*1.0000*j*(j-1)*i/(i+j)/(j+i-1)/(i+j-2));
			if(j>=3) f[i][j]=f[i][j]+(double)(f[i][j-3]*1.0000*j*(j-1)*(j-2)/(i+j)/(i+j-1)/(i+j-2));
		}
	}
	printf("%.9lf",f[w][b]);
}
02-01 13:40