题目链接: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]); }