链接: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 ",x,y,z); } return 0; }