cf#301-D - Bad Luck Island-概率dp(水 )

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;
 
}


你可能感兴趣的:(cf#301-D - Bad Luck Island-概率dp(水 ))