Codeforces Round #301 (Div. 二) D(概率dp)
Codeforces Round #301 (Div. 2) D(概率dp)
题意:石头剪刀布游戏,给你r个石头,s个剪刀,p个布,问你最后只剩下单个种类的概率分别是多少;
思路:很简单的概率dp,用dp[r][s][p] 表示还剩下r个石头,s个剪刀,p个布的概率,那么最终我们只要分别累加 dp[r][0][0],dp[[0][s][0],dp[0][0][p]就OK啦!
代码如下:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N = 105; double dp[N][N][N]; int r, s, p; int main() { while(~scanf("%d%d%d", &r, &s, &p)) { memset(dp, 0, sizeof(dp)); dp[r][s][p] = 1; for(int i = r; i >= 0; i--) { for(int j = s; j >= 0; j--) { for(int k = p; k >= 0; k--) { if(!i && !j || !i && !k || !j && !k) continue; double ans = dp[i][j][k]; double tmp = i*j + i*k + j*k; if(i) dp[i-1][j][k] += ans*double(i*k)/tmp; if(j) dp[i][j-1][k] += ans*double(i*j)/tmp; if(k) dp[i][j][k-1] += ans*double(j*k)/tmp; } } } double a = 0, b = 0, c = 0; for(int i = 1; i <= r; i++) a += dp[i][0][0]; for(int j = 1; j <= s; j++) b += dp[0][j][0]; for(int k = 1; k <= p; k++) c += dp[0][0][k]; printf("%.9lf %.9lf %.9lf\n", a, b, c); } return 0; }