zoukankan      html  css  js  c++  java
  • CodeForces 148D Bag of mice

    题意:袋子里有w只白鼠和b只黑鼠。龙和公主轮流从袋子里抓老鼠。谁先抓到白色老师谁就赢。公主每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。每次抓老鼠和跑出来的老鼠都是随机的。如果两个人都没有抓到白色老鼠则龙赢。公主先抓。问公主赢的概率。

    解法:就是最普通的概率DP,加了些限制条件。设p[i][j]表示袋子里有i只白鼠,j只黑鼠时,公主先抓公主赢的概率。

       边界条件p[0][0] = 0,p[i][0] = 1,p[0][i] = 0,p[i][1] = i / (i+1)。

       状态转移方程p[i][j] = i/(i+1) + j/(i+j) * (j-1)/(i+j-1) * ((j-2)/(i+j-2) * p[i][j-3] + i/(i+j-2) * p[i-1][j-2])。

    tag:math, 概率dp, 水题

     1 /*
     2  * Author:  Plumrain
     3  * Created Time:  2013-11-11 15:38
     4  * File Name: DP-CF-148D.cpp
     5  */
     6 #include <iostream>
     7 #include <cstdio>
     8 #include <cstring>
     9 
    10 using namespace std;
    11 
    12 #define CLR(x) memset(x, 0, sizeof(x))
    13 
    14 double p[1005][1005];
    15 
    16 void DP()
    17 {
    18     CLR (p);
    19     for (int i = 0; i <= 1001; ++ i){
    20         p[i][0] = 1.0;
    21         p[0][i] = 0.0;
    22         p[i][1] = (double)i / (i + 1);
    23     }
    24     for (int i = 1; i <= 1001; ++ i)
    25         for (int j = 2; j <= 1001; ++ j){
    26             p[i][j] = (double)i / (i + j);
    27             double tmp = (double)j * (j-1) / (i + j) / (i + j - 1);
    28             if (j > 2)
    29                 p[i][j] += tmp * (double)(j-2)/(i+j-2) * p[i][j-3];
    30             p[i][j] += tmp * (double)i/(i+j-2) * p[i-1][j-2];
    31         }
    32 }
    33 
    34 int main()
    35 {
    36     DP();
    37     int w, b;
    38     while (scanf ("%d%d", &w, &b) != EOF)
    39         printf ("%.10f
    ", p[w][b]);
    40     return 0;
    41 }
    View Code
    ------------------------------------------------------------------
    现在的你,在干什么呢?
    你是不是还记得,你说你想成为岩哥那样的人。
  • 相关阅读:
    团队介绍与选题报告
    实验6:开源控制器实践——RYU
    二叉搜索树的2层结点统计 (25 分)
    2020团队程学设计天梯赛-总决赛
    口罩发放 (25 分)
    九宫格输入法
    检查密码
    暑期训练10-1010
    暑期训练09-1003
    数据结构之循环队列
  • 原文地址:https://www.cnblogs.com/plumrain/p/CF_148D.html
Copyright © 2011-2022 走看看