zoukankan      html  css  js  c++  java
  • Codeforces Round #301 (Div. 2) D 概率DP

    一个岛上住着三种生物,石头(R)、剪刀(S)和布(P)。两个不同的生物见面会打架,并且有一方死亡,已知各生物碰见的概率是一样的,求最后岛上只留下剪刀、石头、布的概率。

    dp[r][s][p] : 石头,剪刀,布分别剩下r,s,p的概率这时,布和石头打一架,将转移到dp[r-1][s][p],而布和石头打架的概率是(p*r)/(r*s + s*p + p*r),

    同理,dp[r][s][p]可以转移到状态dp[r][s-1][p] 和dp[r][s][p-1];

    最后统计结果就行。

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    double dp[110][110][110];
    
    double comlex (int a, int b, int c) {
        return (double)(a * b) / (a * b + b * c + c * a);
    }
    
    int main () {
        int R, S, P; 
    
        cin >> R >> S >> P;
        dp[R][S][P] = 1.0;
    
        for (int r = R; r >= 0; r--) {
            for (int s = S; s >= 0; s--) {
                for (int p = P; p >= 0; p--) {
                    if ((r == 0 && s == 0) || (s == 0 && p == 0) || (p == 0 && r == 0)) continue;
                    if (r-1 >= 0) dp[r-1][s][p] += dp[r][s][p] * comlex(p, r, s);
                    if (s-1 >= 0) dp[r][s-1][p] += dp[r][s][p] * comlex(r, s, p);
                    if (p-1 >= 0) dp[r][s][p-1] += dp[r][s][p] * comlex(s, p, r);
                }
            }
        }
    
        double rocks = 0.0;
        double scissors = 0.0;
        double papers = 0.0;
    
        for (int r = 1; r<=R; r++) {
            rocks += dp[r][0][0];
        }
        for (int s = 1; s<=S; s++) {
            scissors += dp[0][s][0];
        }
        for (int p = 1; p<=P; p++) {
            papers += dp[0][0][p];
        }
    
        printf ("%.9lf %.9lf %.9lf
    ", rocks, scissors, papers);
        return 0;
    }
    View Code
  • 相关阅读:
    使用 Markdown Flow 画流程图
    两串锂电池的电池匹配
    笔记: CC2540 和 CC2541 的区别
    Elasticsearch 5.x 关于term query和match query的认识
    es 批量导入文件
    mac 下搭建Elasticsearch 5.4.3分布式集群
    Elastic Search 5.4.3 java api 入门
    solr java demo 基础入门
    创建索引并进行查询
    RabbitMq 之简单队列
  • 原文地址:https://www.cnblogs.com/xuelanghu/p/4543867.html
Copyright © 2011-2022 走看看