• 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]);
    }
  • 相关阅读:
    计算素数。
    两个div在一行中显示
    html文本太长显示为省略号的方法
    .net remoting实例
    C#核心基础--静态类&部分类
    C#核心基础--类的继承
    c#核心基础--类的构造方法
    C#核心基础--类的声明
    C#核心基础--浅谈类和对象的概念
    c#学习之旅------01
  • 原文地址:https://www.cnblogs.com/zcb123456789/p/13719235.html
Copyright © 2020-2023  润新知