CF148D Bag of mice ###K

题目链接:https://codeforces.ml/problemset/problem/148/D

思路:概率dp   概率顺推 期望逆推   dp[i][j] 表示有i只白鼠 j只黑鼠 A的获胜概率

每次的状态是 A直接拿到白鼠   A拿到黑鼠 B拿到黑鼠 跑了一只黑鼠    A拿到黑鼠 B拿到黑鼠 跑了一只白鼠三种状态

和期望dp类似 也是通过转移上一次的状态 乘上概率得到答案

 

因为受a b同时影响,所以每次的操作将A,B都操作完看作是一次操作来转移

A拿到白鼠是直接获胜所以没有dp[i-1][j] 转移过来,而是直接结束状态, 其他有转移过来是因为其他的是可能获胜

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e3+10;
 4 #define ll long long
 5 #define pb push_back
 6 double dp[maxn][maxn];
 7 
 8 
 9 int main()
10 {
11   ios::sync_with_stdio(0);
12   cin.tie(0);
13   int w,b;
14   cin>>w>>b;
15   for(int i=1;i<=w;i++)
16     dp[i][0]=1.0;
17   for(int i=1;i<=w;i++)
18   {
19     for(int j=1;j<=b;j++)
20     {
21         dp[i][j]=1.0*i/(i+j);
22       if(j>=2)
23         dp[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2];
24       if(j>=3)
25         dp[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
26     }
27   }
28   cout<<fixed<<setprecision(9)<<dp[w][b]<<'\n';
29 
30 
31 }
View Code

 

 

// 为什么不是由来的状态计算概率

posted @ 2020-11-27 14:54  canwinfor  阅读(84)  评论(0)    收藏  举报