在黑石岛上生活着三种生物:r只石头,s只剪刀,p只布,每一次随机两只会相遇(每两只相遇的概率均相同).如果两只不同的生物相遇其中一只会死掉(石头杀死剪刀,剪刀杀死布,布杀死石头),相同的生物相遇则不会发生任何事情.你的任务是计算到最后时只剩下一种生物的概率. 输入描述输入案例有多组,每组数据占据一行,每行输入三个整数,r,s,p ( 1<= r,s,p <=100 ). 输出描述对应每组数据的输出占一行,输出三个数.分别表示剩下石头,剪刀,布的概率.最后保留9位小数,每个数之间有一个空格,最后没有空格. 样例输入2 2 2 2 1 2 1 1 3 样例输出0.333333333333 0.333333333333 0.333333333333 0.150000000000 0.300000000000 0.550000000000 0.057142857143 0.657142857143 0.285714285714 |
概率dp
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#include <queue>
#include <cstring>
#include <bits/stdc++.h>
#define inf 0x7f7f7f
const int M=100005;
double dp[101][101][101];
int main()
{
int r,s,p;
while(cin>>r>>s>>p)
{
memset(dp,0,sizeof(dp));
dp[r][s][p]=1;
int i,j,k;
for(i=r; i>=0; i--)
for(j=s; j>=0; j--)
for(k=p; k>=0; k--)
{
int tmp=i*j+j*k+k*i;
if(tmp==0) continue;
if(j-1>=0)
dp[i][j-1][k]+=i*j*1.0/tmp*dp[i][j][k];
if(k-1>=0)
dp[i][j][k-1]+=j*k*1.0/tmp*dp[i][j][k];
if(i-1>=0)
dp[i-1][j][k]+=k*i*1.0/tmp*dp[i][j][k];
}
double rr,ss,pp;
rr=ss=pp=0;
for(i=1; i<=100; i++)
{
rr+=dp[i][0][0];
ss+=dp[0][i][0];
pp+=dp[0][0][i];
// cout<<dp[i][0][0]<<endl;
}
printf("%.9lf %.9lf %.9lf\n",rr,ss,pp);
}
return 0;
}