CodeForces - 148D
题意
袋子里有a只白鼠和b只黑鼠,Princess和dragon轮流取,Princess先取,dragon取完的时候,会随机跳出来一只老鼠。谁先取到白鼠谁就赢,都没抓到算dragon胜利。问Princess胜利的概率?
题解
概率DP。
dp[i][j]
表示i只白鼠,j只黑鼠的时候公主胜利的概率。
在这一轮,公主胜利的情况有两种:
- princess 直接抓到白鼠,概率为i/(i+j)
- Princess抓到黑鼠,并且dragon也抓到黑鼠,袋子中跳出一只老鼠,接着对老鼠的颜色分析
- 跳出黑鼠,公主胜利的概率为
j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3]
- 跳出白鼠,公主胜利的概率为
j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2]
- 跳出黑鼠,公主胜利的概率为
初始化:
当a为0的时候,公主胜利概率为0
当b=0的时候公主胜利概率为1.
代码
//#include<bits/stdc++.h>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<queue>
#include<map>
#include<time.h>
#define pb push_back
#define read(a) scanf("%d",&a)
#define out(a) printf("%d\n",a)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+10;
const int mod=1000000007;
const ll inf=0x3f3f3f3f3f3f3f3f;
double dp[N][N];
int main()
{
int a,b;
scanf("%d%d",&a,&b);
for(int i=1;i<b;i++)
dp[0][i]=0;
for(int i=1;i<=a;i++)
dp[i][0]=1;
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
{
dp[i][j]+=(double)i/(i+j);
if(j>=2) dp[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*(i)/(i+j-2)*dp[i-1][j-2];
if(j>=3) dp[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
}
}
printf("%.9lf\n",dp[a][b]);
return 0;
}