我写的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

相关文章:

  • 2021-06-30
  • 2022-02-18
  • 2021-12-09
  • 2021-10-26
  • 2021-12-14
  • 2022-12-23
  • 2021-12-04
  • 2021-04-30
猜你喜欢
  • 2021-06-16
  • 2022-12-23
  • 2021-06-17
  • 2021-12-22
  • 2021-11-16
  • 2021-05-30
相关资源
相似解决方案