codeforces#148D. Bag of mice(概率dp)

题意:在一个袋子里面有a只白老鼠和b只黑老鼠,先拿到白老鼠的胜利,公主先手,皇子后手,并且皇子拿出一只老鼠后,袋子里面会蹦出一只老鼠

拿每只老鼠的概率相等,蹦出的老鼠也是等概率蹦出的,当公主先手时,求公主获胜的概率

分析:刚开始看题目感觉很复杂,想了很久,突然蹦出一个想法,dp或许可以做,然后就发现原来这题这么简单。这就是传说中的概率dp

首先定义dp[x][y]为有x只白老鼠和y只黑老鼠,公主胜利的概率。那么,

dp[x][y]  公主第一次拿到白鼠的概率 公主拿到黑鼠*皇子拿到黑鼠*蹦出黑鼠*dp[x][y-3] 公主拿到黑鼠*皇子拿到黑鼠*蹦出白鼠*dp[x-1][y-2]

代码:

#include<bits/stdc++.h>
#define ll long long
#define  pa pair<int,int>
using namespace std;
const int maxn=1e3+10;
double dp[maxn][maxn];
double co(int x,int y)
{
    if(x<0||y<0)return 0;
    if(x==1&&y==0)return 1;
    if(x==0&&y==1)return 0;
    if(x==0&&y==0)return 0;
    if(x==1&&y==1)return 0.5;
    if(x==2&&y==0)return 1;
    if(x==0&&y==2)return 0;
    if(fabs(dp[x][y])>0.00000001)return dp[x][y];
    return dp[x][y]=1.0*x/(x+y)+1.0*y/(x+y)*(y-1)/(x+y-1)*(co(x-1,y-2)*x/(x+y-2)+co(x,y-3)*(y-2)/(x+y-2));
}
int main()
{
    int a,b;
    cin>>a>>b;
    printf("%.9f",co(a,b));
    return 0;
}

  

原文地址:https://www.cnblogs.com/carcar/p/10334369.html