CodeForces 148Dバッグオブマウスの確率dp

参照リンク: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 < 0return  0 ;
 22      if(w> 0 && b == 0returndp [w] [b] = 1 ;
 23      if(dp [w] [b]!= -1return 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      forint i = 0 ; i <= w; ++ i)
 41      {
 42         forint j = 0 ; j <= b; ++ j)
 43              dp [i] [j] = -1 ;
44      }
 45      printf(" %.9lf \ n " 、dfs(w、b));
46 }

 

おすすめ

転載: www.cnblogs.com/kongbursi-2292702937/p/12672694.html