CodeForces 540D--概率dp

该博客探讨了一种概率动态规划方法,用于计算在遵循石头剪刀布规则的岛屿上,不同物品(石头、剪刀、布)存活的概率。通过建立三维动态规划模型并进行转移概率计算,可以确定当两种物品剩余时的存活概率。
摘要由CSDN通过智能技术生成

题意:

在一个岛上,有 r 个石头,s 个剪刀和 p 个布,遵循石头剪刀布的规则,他们之间相遇的概率相等,问他们存活的概率。


输入:

2 2 2
2 1 2
1 1 3

输出:

0.333333333333 0.333333333333 0.333333333333
0.150000000000 0.300000000000 0.550000000000
0.057142857143 0.657142857143 0.285714285714

分析:

用一个三维dp来表示岛上存活r,s,p的概率。初始dp[r][s][p]=1,转移:总共情况tol = i*j+i*k+j*k .

转移:

dp[i-1][j][k] += dp[i][j][k]*(i*k*1.0/sum);
dp[i][j-1][k] += dp[i][j][k]*(j*i*1.0/sum);
dp[i][j][k-1] += dp[i][j][k]*(j*k*1.0/sum);

最后留下两个物种在岛上时,就能确定谁能存活了,因为两者是相克的。最后在统一算就好。


代码:


三维dp

<span style="font-family: SimSun;"><span style="font-size:14px;">#include <bits/stdc++.h>
using namespace std;

const int maxn=105;
double dp[maxn][maxn][maxn];
int main()
{
    int r,s,p;
    cin >>r>>s>>p;
    dp[r][s][p]=1.0; //初始状态1
    for(int i=r; i>=1; i--)
    {
        for(int j=s; j>=1; j--)
        {
            for(int k=p; k>=1; k--)
            {
                double sum=i*j+i*k+j*k; //总情况
                dp[i-1][j][k] += dp[i][j][k]*(i*k*1.0/sum);
                dp[i][j-1][k] += dp[i][j][k]*(j*i*1.0/sum);
                dp[i][j][k-1] += dp[i][j][k]*(j*k*1.0/sum);
            }
        }
    }
    double ans1=0.0,ans2=0.0,ans3=0.0;
    for(int i=1; i<=100; i++)
    {
        for(int j=0; j<=100; j++)
        {
            ans1+=dp[i][j][0];
            ans2+=dp[0][i][j];
            ans3+=dp[j][0][i];
        }
    }
    printf("%.10f %.10f %.10f\n",ans1,ans2,ans3);
    return 0;
}
</span></span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值