这是我做的第一道概率DP题;
做完后发现没有后效性的DP是真的水;
在这里说主要是再捋顺一下思路;
设f[i][j]表示有i只白鼠,j只黑鼠是获胜的概率;
显然:f[i][0]=1;
然后分四种情况:
1.先手刚好拿到白鼠:概率是i/(i+j);
2.先手拿到黑鼠,后手拿到了白鼠:概率为0;
3.先手拿到了黑鼠,后手拿到了也黑鼠,并且跑的是白鼠:概率是::dp[i][j]=j/(i+j)∗(j−1)/(i+j−1)∗i/(i+j−2)∗dp[i−1][j−2];
4.先手拿到了黑鼠,后手拿到了也黑鼠,并且跑的是黑鼠:概率是:dp[i][j]=j/(i+j)∗(j−1)/(i+j+1)∗(j−2)/(i+j−2)∗dp[i][j−3];
然后就可以AC掉了;
#include <bits/stdc++.h> using namespace std; double f[1010][1010]; int main() { int w,b; scanf("%d%d",&w,&b); for(register int i=1;i<=w;i++){ f[i][0]=1; for(register int j=1;j<=b;j++){ f[i][j]=(double)i/(double)(i+j); } } for(register int i=1;i<=w;i++){ for(register int j=1;j<=b;j++){ if(j>=2) f[i][j]=f[i][j]+(double)(f[i-1][j-2]*1.0000*j*(j-1)*i/(i+j)/(j+i-1)/(i+j-2)); if(j>=3) f[i][j]=f[i][j]+(double)(f[i][j-3]*1.0000*j*(j-1)*(j-2)/(i+j)/(i+j-1)/(i+j-2)); } } printf("%.9lf",f[w][b]); }