Bad Luck Island-CodeForce(dp)

链接:http://codeforces.com/problemset/problem/540/D

 

题目大意:

这个岛上有三种生物   r石头  s剪刀 p布

求最后只剩一种生物的概率

用dp[i][j][k]表示概率

石头和剪刀相遇的概率是p=i*j/(i*j+j*k+k*i),剪刀会被吃掉  所以dp[i][j-1][k]=dp[i][j][k]*p;每一种情况都会有三种情况演变过来的,所以每次都要加上他

上代码   应该看代码就能看懂

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#define N 110
using namespace std;
double dp[N][N][N];
int main()
{
    int r,s,p,i,j,k;

    while(scanf("%d %d %d",&r,&s,&p)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        dp[r][s][p]=1.0;
        for(i=r;i>=0;i--)
        {
            for(j=s;j>=0;j--)
            {
                for(k=p;k>=0;k--)
                {
                    double sum=i*j+j*k+k*i;
                    if(i && k)
                        dp[i-1][j][k]+=dp[i][j][k]*i*k*1.0/sum;
                    if(j && i)
                        dp[i][j-1][k]+=dp[i][j][k]*i*j*1.0/sum;
                    if(k && j)
                        dp[i][j][k-1]+=dp[i][j][k]*k*j*1.0/sum;
                }
            }
        }
        double x=0,y=0,z=0;
        for(i=r;i>0;i--)
            x+=dp[i][0][0];
        for(i=s;i>0;i--)
            y+=dp[0][i][0];
        for(i=p;i>0;i--)
            z+=dp[0][0][i];
        printf("%.12lf %.12lf %.12lf\n",x,y,z);

    }
    return 0;
}

 

posted @ 2015-11-20 20:52  啦咯  阅读(476)  评论(0编辑  收藏  举报