CodeForces 148D Bag of mice :w个白鼠和b个黑鼠,公主和龙随机轮流取鼠,龙取完会随机掉出一个鼠,谁先拿到白鼠谁赢问公主赢概率 :概率dp
我写的dp方程比较繁琐了,是很自然的想到的,应该有更优的转移方案==
dp[i][j][k1][k2] 表示若有i个白鼠j个黑球:
dp[i][j][0][1]:公主先走赢得概率
dp[i][j][0][0]:公主先走输的概率
dp[i][j][1][1]:龙先走赢得概率
dp[i][j][1][0]:龙先走输的概率
接下来应该比较容易写转移了==
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 double dp[1005][1005][2][2]; 6 int main() 7 { 8 int i,j; 9 for (i=1;i<=1000;i++) { 10 dp[i][0][0][1]=1.0; dp[i][0][0][0]=0.0; 11 dp[0][i][0][1]=0.0; dp[0][i][0][0]=0.0; 12 13 dp[i][0][1][1]=1.0; dp[i][0][1][0]=0.0; 14 dp[0][i][1][1]=0.0; dp[0][i][1][0]=0.0; 15 } 16 for (i=1;i<=1000;i++) 17 for (j=1;j<=1000;j++){ 18 dp[i][j][0][1]=1.0*i/(i+j)+1.0*j/(i+j)*dp[i][j-1][1][0]; 19 dp[i][j][0][0]=1.0*j/(i+j)*dp[i][j-1][1][1]; 20 21 dp[i][j][1][1]=1.0*i/(i+j)+1.0*j/(i+j)* 22 (1.0*(j-1)*dp[i][j-2][0][0]+1.0*i*dp[i-1][j-1][0][0])/(i+j-1); 23 dp[i][j][1][0]=1.0*j/(i+j)* 24 (1.0*(j-1)*dp[i][j-2][0][1]+1.0*i*dp[i-1][j-1][0][1])/(i+j-1); 25 } 26 while (~scanf("%d%d",&i,&j)) 27 printf("%.10lf\n",dp[i][j][0][1]); 28 return 0; 29 }