http://codeforces.com/contest/540/problem/D
题意:给三种人,分别是r,s,p个;
在孤岛上,
每两个不同种人相遇则互吃,r吃s,s吃p,p吃r
求最后留下单一种族的概率
设dp[i][j][k]为 剩下i个r,j个s,k个p 的概率,那么可以得到
当r和p相遇,dp[i-1][j][k]+=dp[i][j][k]*(i*k)/(i*j+j*k+k*i);
同理推出另外2种相遇情况
注意控制条件即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int min(int a,int b)
{return a<b?a:b;}
int max(int a,int b)
{return a>b?a:b;}
double dp[105][105][105];
int main()
{
int r,s,p;
cin>>r>>s>>p;
int i,j,k;
dp[r][s][p]=1;
for (i=r;i>=0;i--)
{
for (j=s;j>=0;j--)
{
for (k=p;k>=0;k--)
{
if (dp[i][j][k]==0)continue;
int kind=0;
if (i)kind++;
if (j)kind++;
if (k)kind++;
if (kind==1)continue;
if (i>0)
dp[i-1][j][k]+=dp[i][j][k]*(i*k)/(i*j+j*k+k*i);
if (j>0)
dp[i][j-1][k]+=dp[i][j][k]*(i*j)/(i*j+j*k+k*i);
if (k>0)
dp[i][j][k-1]+=dp[i][j][k]*(k*j)/(i*j+j*k+k*i);
}
}
}
double a1=0,a2=0,a3=0;
for (i=1;i<=r;i++) a1+=dp[i][0][0];
for (i=1;i<=s;i++) a2+=dp[0][i][0];
for (i=1;i<=p;i++) a3+=dp[0][0][i];
printf("%.9lf %.9lf %.9lf\n",a1,a2,a3);
return 0;
}