一道概率题

论剑F题。。咋一看各种数据需要处理和判断,好像很麻烦。。但是仔细思考之后。其实可以将问题分解为若干个子问题概率来处理;
对于该概率问题,可以先用一个代表颜色的数组分别遍历一遍男主的衣服和裤子,然后得到各种颜色对应的件数,然后就是重点开始了:
遍历出男主的各种穿衣穿裤情况,对应每种情况下算出当前的概率p,并调用一个函数来计算出全部女生中恰好有x个人穿相同衣服裤子的概率和。然后返回与p相乘,继续累加,最终即可得到结果;
点播:
1.对于求出每种颜色的衣服裤子各有多少件,用一个代表颜色的数组去遍历是比较方便后面的利用的;
2.在函数里求概率的时候,应再分解问题,变成先求出每个女生与男主相同的概率,然后用排列组合思想来选出x个的概率。
3.对于第二点中求出x个的概率,
①可以用“位枚举法”,因为每个女生的概率都可以表示为“取”或“不取”,取记为1,概率为p,不取记为0,概率为(1-p);复杂度O2^n(不过要不断优化不然就TLE,但是不确定是否能优化至AC,据说有种DFS+预处理的方法可以强行达到4700MS去AC)
②可以用dp数组,理由与原理与①点相同,注意对dp数组的初始化 和 边界情况的特殊处理,但是却可以大大的减少复杂度,On^2,最终以48ms的速度AC了这道题;
DP方程:dp[i][j]表示从前i个女生取j个与男主穿着相同的概率;
核心代码:

dp[0][0] = 1;
for (i = 1; i <= k; ++i)
{
for (j = 0; j <= i; ++j)
{
if (j - 1 < 0) dp[i][j] = dp[i - 1][j] * (1 - lolip[i]);
else dp[i][j] = dp[i - 1][j] * (1 - lolip[i]) + dp[i - 1][j - 1] * lolip[i];
}
}
return dp[k][x];

4.对于第三点中的①,位枚举法,虽然相当暴力,但也算是一种思想;
就是用二进制(对于每个小事件只有取或不取两种情况)来枚举每一种情况,比如有k个人,那么可以用[0,2^k)的数来表示各种情况!注意区间范围。。。
举例说明:比如,有2个人,那么情况可以有4中,分别是00,01,10,11,各自作为二进制表示的数应该明了了吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值