Codeforces Round #301 (Div. 2) D

概率dp,dp[i][j][k]的状态可以从dp[i+1][j][k],dp[i][j+1][k],dp[i][j][k+1]得到

double dp[110][110][110];

int main() {
    int r,s,p;
    scanf("%d%d%d",&r,&s,&p);
    dp[r][s][p] = 1;
    for(int i = r; i >= 0; i--) {
        for(int j = s; j >= 0; j--) {
            for(int k = p; k >= 0; k--) {
                if(i == r && j == s && k == p);
                else {
                    if((i+1)*k+(i+1)*j+j*k != 0) dp[i][j][k] += dp[i+1][j][k] *(i+1)*1.0*k/((i+1)*k+(i+1)*j+j*k);
                    if((j+1)*i+(j+1)*k+i*k != 0) dp[i][j][k] += dp[i][j+1][k] *(j+1)*1.0*i/((j+1)*i+(j+1)*k+i*k);
					if((k+1)*i+(k+1)*j+i*j != 0) dp[i][j][k] += dp[i][j][k+1] *(k+1)*1.0*j/((k+1)*i+(k+1)*j+i*j);
                }
                
            }
        }
    }
    double a = 0,b = 0,c = 0;
    for(int i = 1; i <= r; i++)a+=dp[i][0][0];
    for(int i = 1; i <= s; i++)b+=dp[0][i][0];
    for(int i = 1; i <= p; i++)c+=dp[0][0][i];
    printf("%.10lf %.10lf %.10lf
",a,b,c);
    return 0;
}
原文地址:https://www.cnblogs.com/ASLHZXY/p/12118291.html