第一道概率期望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; }
原文地址:http://blog.csdn.net/acm_lkl/article/details/43150845