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

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

    题意:一个袋子里有n只白老鼠和m只黑老鼠,公主和龙依次去摸老鼠,先摸到白老鼠的人获胜,由于龙很粗暴,每次摸老鼠时都会有一只老鼠跳出来,而在公主摸老鼠时不会,每只老鼠被摸到和跳出来的概率一样。如果最后都没有摸到白老鼠,则龙获胜。求公主获胜的概率。

    思路:概率dp,先找临界值,如果当袋子中只剩白老鼠了,那此时公主获胜的概率为1。当袋中没有老鼠或只剩黑老鼠时,那公主获胜的概率为0。然后在考虑dp转移(只需要考虑公主可能赢的情况):1.公主抓到一只白鼠,公主赢了。概率为 i/(i+j)

           2.公主抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只黑鼠,概率为:j/(i+j) * (j-1)/(i+j-1) * (j-2)/(i+j-2)。

             3.公主抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只白鼠,概率为:j/(i+j) * (j-1)/(i+j-1) * i/(i+j-2)。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    double dp[1005][1005];
    int main()
    {
        ll n,m;
        cin>>n>>m;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            dp[i][0]=1;
        for(int i=0;i<=m;i++)
            dp[0][i]=0;
        for(ll i=1;i<=n;i++)
            for(ll j=1;j<=m;j++)
        {
            dp[i][j]+=(double)i/(i+j);
            if(j>=3)
                dp[i][j]+=(double)(j*(j-1)*(j-2))/((i+j)*(i+j-1)*(i+j-2)) * dp[i][j-3];
            if(j>=2&&i>=1)
                dp[i][j]+=(double)(j*(j-1)*i)/((i+j)*(i+j-1)*(i+j-2)) * dp[i-1][j-2];
        }
        printf("%.9lf
    ",dp[n][m]);
    }
  • 相关阅读:
    【SSM电商项目后台开发】004-用户模块
    【SSM电商项目后台开发】003-项目架构概览
    C#面向对象编程「字段与属性」
    C#基本语法
    C#学习笔记-简介
    软件工程团队作业展示
    “消灭选择困难症”软件设计规格说明书
    “消灭选择困难APP”软件需求规格说明书
    消灭选择困难APP
    消灭选择困难
  • 原文地址:https://www.cnblogs.com/zcb123456789/p/13719235.html
Copyright © 2011-2022 走看看