题意:在一个袋子里面有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; }