亚瑟王

先来看这篇题解

一些解释:

本题一共有两个对象,轮数和卡牌。我们发现从轮数的角度考虑期望不好计算,所以我们从卡牌的角度考虑

其实不用管这篇题解说的什么线性性,我们感性理解卡牌造成的期望伤害肯定是卡牌实际被使用的概率乘以其伤害值的总和

我们可以比较轻松地证明这一点。我们对任意一个样本,一共有r轮,设其发生的概率是p,一共有t张卡牌被发动,伤害值分别是c1,c2,...,ct,那么这个样本的期望就是p(c1+c2+...+ct)=pc1+pc2+...+pct,我们考虑其中的某一张卡牌ci,他在这个样本中对期望的贡献是pci,那么我们考虑整个样本空间,把ci的所有概率加起来就可以得到结论了

然后接下来我们要求某一张卡牌发动的概率。我们考虑求反面就是不发动的概率,求fp[i]

就像题解说的一样,我们发现中途发动一张卡牌立马结束的条件很烦,所以我们最初的想法是考虑第i张卡牌前面有哪些卡牌被发动了,但是这样时间复杂度就太大了,所以我们考虑抽象一点,就认为有j张卡牌发动了,但是不知道具体是哪j张(其实我做的时候是想到这里的,但是却不知道怎么继续往下推导)

这个时候精髓就来了,为什么题解那样的推导成立?其实我们可以从条件概率的角度考虑。在f[i1][j]表示的任意一个样本中,有j张卡牌发动了就表示有ij1张卡牌没发动,注意在这个条件下,前面i1张牌的状态是确定的,要么发动了要么没发动(尽管没发动的牌没有体现在r轮的某一轮中),所以在这r轮中,当某一轮没有被这j张牌中的某一张牌占据的时候,我们一直循环到第i张牌之前的概率都是1×1×1...1表示要么发动了要么没发动(想一想,条件概率不就是这么算的吗?已经确定了的东西的概率都变成1了),所以一直循环到第i张牌的时候,只用考虑第i张牌的概率就好了

那么求解f的时候是一样考虑的。但是有一个小点要注意,比如说求f[i][j]的时候,第i张牌如果不选择,为什么f[i1][j]还要乘上那一坨?因为f[i1][j]表示的所有样本是包含了选择i的情况的(即第i张牌在某一轮被发动了),所以我们要排除这种情况

这道题目给我们的启示就是注意,这种“隐性”的条件概率,没有体现在样本空间的对象的概率也是确定的。而且以后多从条件概率的角度考虑问题

update 2024.5.4

其实这道题目为什么要以卡牌为考虑对象,就是因为我们可以像罗森的离散数学教材一样考虑,我们直接将r轮游戏作为一个整体(一个实验)去考虑这个实验出来的实验结果对所有卡牌的影响

然后算每张卡牌发动的概率的时候,就是没办法知道哪些卡牌被发动了(比如设f[i][j]表示前i轮第j张卡牌发动的概率就推不走)。我们设置局部状态推不走的话,就直接设置全局状态,就像题解那样设置(其实也就是我们没办法确定具体是哪j张牌,就退而求其次,先确定总共有j张牌被选了,但是这个时候肯定就要把轮数这一维去掉了,只能考虑全局了)

然后fp为什么可以这么推?其实最初版本写的条件概率那里不是太好理解。实际上,对于f[i1][j]确定的任意一个样本中,前i1张牌的状态的确确定了,但是在每一轮中如果可以走到第i张牌的决策,第i张牌到第n张牌无论怎么决策都不会影响每一轮前i1张牌的发生的情况,所以这个原因才是为什么我们可以直接用f[i1][j]作为乘数

update 2024.8.13

这里还有一篇题解写的也很不错

感觉这道题目就是从横着算概率变成从竖着算概率了。每一行就是每一轮游戏,一共有r行,每一列就是卡牌,一共有n列,于是可以描述这个实验的进程

posted @   最爱丁珰  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示