AtCoder Beginner Contest 184 D(概率dp)

该博客介绍了AtCoder Beginner Contest 184 D题的解题思路,主要涉及概率DP的应用。作者通过设立dp[i][j][k]表示金币、银币、青铜币数量的概率,并给出初始状态和转移方程。计算金币、银币和青铜币期望达到100个所需操作次数的方法也一并阐述,文章重点在于解析概率动态规划的实现过程,时间复杂度为O(n^3)。
摘要由CSDN通过智能技术生成

题意:
我们有一个装有A金币,B银币和C青铜币的袋子。
在袋子中装有100个相同颜色的硬币之前,我们将重复以下操作:操作:从袋子中随机取出一个硬币(每个硬币被选择的可能性相同)。然后,将两个硬币放回袋子中 与取出的硬币相同。
查找操作完成次数的期望值。

题解:
我们设dp[i][j][k]表示金币为i时,银币为j时,铜币为k时的概率。初始时dp[a][b][c]概率为1。根据题意,我们每一次取出一个金币的概率为i/(i+j+k),转移方程为dp[i+1][j][k] += dp[i][j][k] * i /(i+j+k)。金币的期望E则为i从(b~99),j从(c,99) 得到(100+i+j-a-b-c)*dp[100][i][j]。银币和铜币的做法类似,具体看一下代码,时间复杂度为n^3

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105;
double dp[N][N][N];
int main() {
   
	int a,b,c;
	cin>>a>>b>>c;
	dp[a][b][c] = 1.0;
	for(int
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值