参照リンク:https://www.cnblogs.com/Howe-Young/p/5514371.html
タイトル:w白ねずみb黒ねずみを袋に入れて、プリンセスが最初にフェッチし、ドラゴンが後で、プリンセスが残りから1つをフェッチするとき、ドラゴンがフェッチするとき残りのいずれかが取得されますが、取得後にランダムにポップアウトされます。各マウスを取得する確率は同じであり、ジャンプは同じです。最初に白ネズミを勝ち取って、最後にプリンセスが勝つ確率を聞いてください。
アイデア:確率dp、プリンセスを2つの状況に分けることができる場合、この質問は再帰的です。メモリ検索を使用して書きました。まず、dp [i] [j]を使用して、バッグにi白とj黒の王女が勝つ確率を表します。次に、2つのケースがあります:
1.このステップは勝つことができ、白は直接取得され、確率はi /(i + j);
2.このステップは勝ちません。プリンセスが勝つためには、ドラゴンは勝たず、ジャンプマウスの色に問題があります。それは、2つの場合に分けられます
。1)飛び出しが白です。確率は、j /(i + j)*(j-1)/(i + j-1)*(i)/(i + j-2)* dp [i-1](j-2]
2)です。飛び出した部分が真っ黒でした。確率は、j /(i + j)*(j-1)/(i + j-1)*(j-2)/(i + j-2)* dp [i] [j-3]が
ここにプッシュされる確率です基本的には、残りの境界条件が出ました。i == 0の場合、確率は0でなければならず、i> 0 && j == 0の場合、確率は1でなければなりません。
コード:
1 #include <stdio.h> 2 #include < string .h> 3 #include <iostream> 4 #include <algorithm> 5 #include <queue> 6 #include <map> 7 #include <vector> 8 #include < math.h> 9 #define mem(a、x)memset(a、x、sizeof(a)) 10 名前空間std を使用 ; 11 typedef long long LL; 12 const int maxn = 1005 ; 13 const int mod = 26 ; 14 const int INF = 0x3f3f3f3f ; 15 const int Times = 10 ; 16 const int N = 5500 ; 17 double dp [maxn] [maxn]; 18 double dfs(int w、int b) 19 { 20 // b <0 dfの動作は望ましくない 21 if(w <= 0 || b < 0)return 0 ; 22 if(w> 0 && b == 0)returndp [w] [b] = 1 ; 23 if(dp [w] [b]!= -1)return dp [w] [b]; 24 double temp1 =(double)w /(w + b); / / 白いボールを直接 取得する25 double temp2 =(double)b /(w + b); 26 dp [w] [b] = temp1; 27 if(w + b> 2)// 分母が0にならないようにする 28 { 29 double ans1 = dfs(w、b- 3)*(b- 1)/(w + b- 1)*(b- 2)/(w + b- 2 ); 30 double ans2 = dfs(w- 1、b- 2)*(b- 1)/(w + b- 1)*(w)/(w + b- 2 ); 31 temp2 * =(ans1 + ans2); 32 dp [w] [b] + = temp2; 33 } 34 return dp [w] [b]; 35 } 36 int main() 37 { 38 int w、b; 39 cin >> w >> b; 40 for(int i = 0 ; i <= w; ++ i) 41 { 42 for(int j = 0 ; j <= b; ++ j) 43 dp [i] [j] = -1 ; 44 } 45 printf(" %.9lf \ n " 、dfs(w、b)); 46 }