codeforces 540D 概率DP

codeforces 540D


题意:

指 定 r 个 人 出 石 头 , s 个 人 出 剪 刀 , p 个 人 出 布 。 指定r个人出石头,s个人出剪刀,p个人出布。 rsp
每 隔 一 段 时 间 两 两 相 遇 , 按 照 剪 刀 石 头 布 的 规 则 , 可 能 会 有 一 人 淘 汰 出 局 。 每隔一段时间两两相遇,按照剪刀石头布的规则,可能会有一人淘汰出局。
问 最 终 三 个 阵 营 获 胜 的 概 率 。 问最终三个阵营获胜的概率。


题解:

d p [ i ] [ j ] [ k ] 表 示 石 头 还 剩 下 i 人 , 剪 刀 还 剩 下 j 人 , 布 还 剩 下 k 人 的 概 率 。 dp[i][j][k]表示石头还剩下i人,剪刀还剩下j人,布还剩下k人的概率。 dp[i][j][k]ijk

  • 石 头 和 布 相 遇 , d p [ i − 1 ] [ j ] [ k ] + = d p [ i ] [ j ] [ k ] ∗ i ∗ k i ∗ j + j ∗ k + k ∗ i 石头和布相遇,dp[i-1][j][k] += dp[i][j][k]*\frac {i*k}{i*j+j*k+k*i} dp[i1][j][k]+=dp[i][j][k]ij+jk+kiik
  • 石 头 和 剪 刀 相 遇 , d p [ i ] [ j − 1 ] [ k ] + = d p [ i ] [ j ] [ k ] ∗ i ∗ j i ∗ j + j ∗ k + k ∗ i 石头和剪刀相遇,dp[i][j-1][k] += dp[i][j][k]*\frac {i*j}{i*j+j*k+k*i} dp[i][j1][k]+=dp[i][j][k]ij+jk+kiij
  • 剪 刀 和 布 相 遇 , d p [ i ] [ j ] [ k − 1 ] + = d p [ i ] [ j ] [ k ] ∗ j ∗ k i ∗ j + j ∗ k + k ∗ i 剪刀和布相遇,dp[i][j][k-1] += dp[i][j][k]*\frac {j*k}{i*j+j*k+k*i} dp[i][j][k1]+=dp[i][j][k]ij+jk+kijk

#include <bits\stdc++.h>
using namespace std;
const int N = 101;
double dp[N][N][N];

double getP(int a, int b, int c){
    if(a*b+b*c+c*a == 0){
        return 0;
    }
    return (a*b)*1.0/(a*b+b*c+c*a)*1.0;
}

int main() {
    int r, s, p;
    cin >> 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 >= 1){
                    dp[i-1][j][k] += dp[i][j][k]*getP(i, k, j);
                }
                if(j >= 1){
                    dp[i][j-1][k] += dp[i][j][k]*getP(i, j, k);
                }
                if(k >= 1){
                    dp[i][j][k-1] += dp[i][j][k]*getP(j, k, i);
                }
            }
        }
    }
    double pr = 0, ps = 0, pp = 0;
    for(int i = 0 ; i <= r ; i++){
        pr += dp[i][0][0];
    }
    for(int i = 0 ; i <= s ; i++){
        ps += dp[0][i][0];
    }
    for(int i = 0 ; i <= p ; i++){
        pp += dp[0][0][i];
    }
    cout << setiosflags(ios::fixed) << setprecision(9) << pr << ' ' << ps << ' ' << pp << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值