Codeforce 540D(概率dp)

来源:互联网 发布:哪个fm软件好 知乎 编辑:程序博客网 时间:2024/06/01 09:10

链接:点击打开链接

题意:有x个石头,y个剪刀,z个布,两两相遇,按照石头剪刀布的规则,每次相遇会减少一个,问最后只剩剪刀,只剩石头,和的只剩布的概率

代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;double dp[105][105][105];int main(){    int x,y,z,i,j,k,tmp;    double ans1,ans2,ans3;    while(scanf("%d%d%d",&x,&y,&z)!=EOF){        for(i=0;i<=x;i++)                       //dp[i][j][k]表示剩i个石头,j个剪刀,k个布的概率        for(j=0;j<=y;j++)        for(k=0;k<=z;k++)        dp[i][j][k]=0;        dp[x][y][z]=1.0;        for(i=x;i>=0;i--){                          for(j=y;j>=0;j--){                for(k=z;k>=0;k--){                              tmp=i*j+j*k+i*k;            //要算一定会减少一个人的方案数数                    if(i>=1&&k>=1)                    dp[i-1][j][k]=(dp[i-1][j][k]+dp[i][j][k]*(i*k*1.0/tmp));                    if(j>=1&&i>=1)                    dp[i][j-1][k]=(dp[i][j-1][k]+dp[i][j][k]*(i*j*1.0/tmp));                    if(j>=1&&k>=1)                    dp[i][j][k-1]=(dp[i][j][k-1]+dp[i][j][k]*(j*k*1.0/tmp));                }            }        }        ans1=ans2=ans3=0;        for(i=1;i<=x;i++)        ans1+=dp[i][0][0];        for(i=1;i<=y;i++)        ans2+=dp[0][i][0];        for(i=1;i<=z;i++)        ans3+=dp[0][0][i];        printf("%.10lf %.10lf %.10lf\n",ans1,ans2,ans3);    }    return 0;}


 

0 0