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\n",dp[n][m]);
}

 

posted @ 2020-09-23 16:23  ~zcb  阅读(124)  评论(0编辑  收藏  举报