CDOJ 1135 邱老师看电影 概率dp
概率dp
代码:
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int maxn = 1e3+10; 7 8 double dp[maxn][maxn]; 9 10 double dfs(int w,int b){ 11 if(dp[w][b] >= 0) return dp[w][b]; 12 if(w == 0) return 0; 13 if(b==0 && w!=0) return 1; 14 dp[w][b] = w*1.0/(w+b); 15 if(b >= 2){ 16 double tb = b*1.0/(w+b) * (b-1)*1.0/(w+b-1); //要想在下一次取胜则本次学妹应该拿走一个黑鼠 邱也必须拿走一个黑鼠 酱神可以任意拿走一个白鼠或一个黑鼠 17 if(b >= 3) 18 dp[w][b] += tb * dfs(w,b-3) * (b-2)*1.0/(w+b-2);//酱神拿走黒鼠 学妹和邱老师各拿走一只黑鼠 19 if(w >= 1) 20 dp[w][b] += tb * dfs(w-1,b-2) * w*1.0/(w+b-2); //酱神拿走白鼠 21 } 22 return dp[w][b]; 23 } 24 25 int main(){ 26 memset(dp,-1,sizeof(dp)); 27 int w,b; cin >> w >> b; 28 printf("%.9f\n",dfs(w,b)); 29 }