2015-04-22 01:54:59
思路:
概率dp水题... 被 vj 翻译过来的中文坑惨了... (竟然是错的QAQ)
dp[i][j]表示尚有 i 个白,j 个黑的胜率,递推方程很水。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <vector> 6 #include <map> 7 #include <set> 8 #include <stack> 9 #include <queue> 10 #include <string> 11 #include <iostream> 12 #include <algorithm> 13 using namespace std; 14 15 #define MEM(a,b) memset(a,b,sizeof(a)) 16 #define REP(i,n) for(int i=0;i<(n);++i) 17 #define FOR(i,a,b) for(int i=(a);i<=(b);++i) 18 #define getmid(l,r) ((l) + ((r) - (l)) / 2) 19 #define MP(a,b) make_pair(a,b) 20 21 typedef long long ll; 22 typedef pair<int,int> pii; 23 const int INF = (1 << 30) - 1; 24 const int MAXN = 1010; 25 26 int w,b; 27 double dp[MAXN][MAXN]; 28 29 int main(){ 30 scanf("%d%d",&w,&b); 31 for(int i = 1; i <= w; ++i) 32 dp[i][0] = 1.0; 33 for(int i = 1; i <= w; ++i){ 34 for(int j = 0; j <= b; ++j){ 35 dp[i][j] = 1.0*i/(i+j); 36 if(i&&j>1) dp[i][j] += dp[i-1][j-2]*i*j*(j-1)/(i+j)/(i+j-1)/(i+j-2); 37 if(j>2) dp[i][j] += dp[i][j-3]*j*(j-1)*(j-2)/(i+j)/(i+j-1)/(i+j-2); 38 } 39 } 40 printf("%.12f\n",dp[w][b]); 41 return 0; 42 }