CodeForces 148D Bolsa de ratones probabilidad dp

Enlace de referencia: https://www.cnblogs.com/Howe-Young/p/5514371.html

 

Título: Déle w ratones blancos yb ratones negros, póngalos en una bolsa, princesa busque primero, dragón después, cuando la princesa busque a cualquiera del resto, cuando el dragón tome Cualquiera de las dos se tomará el resto del tiempo, pero una se sacará al azar una vez que se haya tomado. La probabilidad de obtener cada mouse es la misma, y ​​el salto es el mismo. Primero haz que gane el ratón blanco y pregunta la probabilidad de que la princesa gane al final.

Idea: Probabilidad dp, si la princesa se puede dividir en dos situaciones, entonces esta pregunta es recursiva, la escribí usando la búsqueda de memoria. Primero, use dp [i] [j] para representar la probabilidad de que haya i princesa blanca y j princesa negra en la bolsa para ganar. Luego hay dos casos:
1. Este paso puede ganar, luego el blanco se obtiene directamente, la probabilidad es i / (i + j);
2. Este paso no gana, entonces la corriente debe ser negra, porque el último Para que la princesa gane, entonces, entonces el dragón no ganará, y ahora hay un problema, el color del ratón que saltó, luego se divide en dos casos:
  1). El salto es blanco. La probabilidad es j / (i + j) * (j-1) / (i + j-1) * (i) / (i + j-2) * dp [i-1] (j-2]
  2). Lo que saltó fue negro. La probabilidad es que j / (i + j) * (j-1) / (i + j-1) * (j-2) / (i + j-2) * dp [i] [j-3] se
presione aquí Básicamente salió, las condiciones límite restantes. Si i == 0, entonces la probabilidad debe ser 0, si i> 0 && j == 0 entonces la probabilidad debe ser 1.

 

 

Código:

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  usando el  espacio de nombres std;
11 typedef largo  largo 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 El comportamiento de un dfs no es deseable 
21      if (w <= 0 || b < 0 ) return  0 ;
 22      if (w> 0 && b == 0 ) returndp [w] [b] = 1 ;
 23      if (dp [w] [b]! = -1 ) devuelve dp [w] [b];
 24      doble temp1 = ( doble ) w / (w + b);   / / Obtenga la bola blanca directamente 
25      doble temp2 = ( doble ) b / (w + b);
 26      dp [w] [b] = temp1;
 27      if (w + b> 2 ) // Para evitar que el denominador sea 0 
28      {
 29          doble ans1 = dfs (w, b- 3 ) * (b- 1 ) / (w + b- 1 ) * (b- 2 ) / (w + b- 2 );
30          doble 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      para ( int i = 0 ; i <= w; ++ i)
 41      {
 42         para ( int j = 0 ; j <= b; ++ j)
 43              dp [i] [j] = - 1 ;
44      }
 45      printf ( " % .9lf \ n " , dfs (w, b));
46 }

 

Supongo que te gusta

Origin www.cnblogs.com/kongbursi-2292702937/p/12672694.html
Recomendado
Clasificación