标签:return 接下来 code ORC print 状态 1.0 open 个人
a和b两个人玩游戏,一开始有w只白老鼠和b只黑老鼠,a先抓一只老鼠,然后b抓一只老鼠,由于b动作太大,会吓跑1只老鼠,谁先抓到一只白老鼠算赢,如果只有黑老鼠或者没有老鼠了算b赢,要你求出a胜出的概率:
感觉这题有点博弈的味道,但是其实是一道概率题!首先设还剩i只白老鼠和j只黑老鼠时a胜出的概率为dp[i][j],那么接下来要怎么推出它。
试想一下所有的情况: 1:a取出一只白老鼠,a胜出
2:a取出一只黑老鼠,b取出一只黑老鼠,跑掉一只白老鼠
3:a取出一只黑老鼠,b取出一只黑老鼠,跑掉一只白老鼠
第4中情况不可能出现,因为这标志着a输了,而我们所设的状态的意思是a赢了,而且2,3表示的是平局,他还要加上a赢了的概率
接下来是ac代码:
1 include<bits/stdc++.h> 2 using namespace std; 3 int w,b; 4 double dp[1010][1010]; 5 int main(){ 6 scanf("%d%d",&w,&b); 7 for(int i=1;i<=w;i++) dp[i][0]=1; 8 for(int i=1;i<=w;i++){ 9 for(int j=1;j<=b;j++){ 10 dp[i][j]=((1.0*i)/(i+j)); 11 if(j>=3) dp[i][j]+=(1.0*j)/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3]; 12 if(j>=2) dp[i][j]+=(1.0*j)/(i+j)*(j-1)/(i+j-1)*(i)/(i+j-2)*dp[i-1][j-2]; 13 } 14 } 15 printf("%.9lf\n",dp[w][b]); 16 return 0; 17 }
标签:return 接下来 code ORC print 状态 1.0 open 个人
原文地址:https://www.cnblogs.com/pandaking/p/9955691.html