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 }
View Code

题目链接:http://codeforces.com/problemset/problem/148/D

posted on 2015-03-28 01:43  xiao_xin  阅读(197)  评论(0编辑  收藏  举报

导航