题意:石头剪刀布游戏,给你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;
}