题意:
公主和龙比谁先抓到白老鼠,公主每次抓一个,龙每次抓一个,放跑一个。放跑的不算抓到的。如果都没抓到算龙win。询问公主win的概率
思路:
如果公主赢,那么必定抓到了白老鼠,状态转移方程如代码,如果大于2,可以抓黑老鼠,放跑白老鼠,如果大于3可以抓黑老鼠,放跑黑老鼠
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
double dp[1005][1005];
//dp[i 白老鼠] [j 黑老鼠] =c 获胜概率
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
dp[i][0]=1.0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]+=1.0*i/(i+j);
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];
}
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];
}
}
}
printf("%.9lf\n",dp[n][m]);
}