题意:一个袋子里面有黑球和白球,alice 和 bob 轮流取 ,Alice先取,谁最先取到白球谁获胜,当bob取出一个球以后,袋子里面会随机消失一个球。问Alice获胜的几率。
解题思路:二维dp,dp[i][j]表示取到 第i次 还 剩j 个白球的几率,dp时候讨论三种情况就行。
解题代码:
1 // File Name: 148d.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月11日 星期三 10时11分37秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 double dp[2005][1005]; 28 int main(){ 29 int w, b; 30 scanf("%d %d",&w,&b); 31 if(w == 0) 32 { 33 printf("%.9f",0.0); 34 return 0 ; 35 } 36 dp[0][w] = 1; 37 double sum = 0 ; 38 int n = w + b; 39 for(int i = 1;i <= n; i++) 40 { 41 for(int j = 0;j <= w;j ++) 42 { 43 if(i % 3 == 1 ){ 44 sum += dp[i-1][j+1]*(j+1)/(n-i+1); 45 dp[i][j] = dp[i-1][j] * (n-i+1-j)/(n-i+1); 46 } 47 else if(i% 3 == 2 ){ 48 dp[i][j] = dp[i-1][j] * (n-i+1-j)/(n-i+1); 49 } 50 else{ 51 dp[i][j] = dp[i-1][j] * (n-i+1-j)/(n-i+1); 52 dp[i][j] += dp[i-1][j+1]*(j+1)/(n-i+1); 53 } 54 } 55 } 56 printf("%.9f",sum); 57 return 0; 58 }
没有梦想,何谈远方