第一道概率期望dp:)
其实和一般的dp也差不多,只要状态选好就行了。
定义dp[i][j]表示还剩i只白老鼠j只黑老鼠时候公主赢得概率。
则:1.公主选白老鼠,直接赢,概率:i/(i+j)
2.公主选黑老鼠
1)龙选黑老鼠,逃走黑老鼠;概率:j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)
2) 龙选黑老鼠,逃走白老鼠;概率:j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)
3) 龙选白老鼠,这样公主是必输的,不用考虑
然后dp[i][j]等于以上概率之和。
初始化时,如果只要白老鼠则获胜概率为1
如果只要黑老鼠则获胜概率为0
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
double dp[1100][1100];
int main()
{
int w,b;
while(scanf("%d%d",&w,&b)!=EOF)
{
for(int i=1;i<=w;i++)
dp[i][0]=1;
for(int j=1;j<=b;j++)
dp[0][j]=0;
for(int i=1;i<=w;i++)
for(int j=1;j<=b;j++)
{
dp[i][j]=1.0*i/(i+j);
if(j>=3)
dp[i][j]+=j*1.0/(i+j)*(j-1)*1.0/(i+j-1)*(j-2)*1.0/(i+j-2)*dp[i][j-3];
if(j>=2)
dp[i][j]+=j*1.0/(i+j)*(j-1)*1.0/(i+j-1)*i*1.0/(i+j-2)*dp[i-1][j-2];
}
printf("%.9lf\n",dp[w][b]);
}
return 0;
}