假面

这道题目我维护每个回合每个人的每种血量的概率想到了,甚至DP也想到了,但是这个DP的方法太新了

因为本来维护每个回合每个人的每种血量的概率后,我们如果用组合数去选出若干个人计算概率,肯定时间复杂度太大了,这个时候我们一般都是用DP去统计满足条件的概率,所以要用DP,而且比较容易想到要计算\(g[i][j]\)表示第\(i\)个人以及其余还有\(j\)个人活着的概率(但是将第\(i\)个人放在最后,这确实是非常新的思想了,可以记住)

见这篇题解

一些解释:

\(f[i][j]\)涉及的\(i\)个人是某一次使用结界技能时题目给出的\(k\)个人(而不是全部\(n\)个敌人)

文章中说“\(f[k-1]\)就是\(g[i]\)”的意思是\(f[k-1][j]=g[i][j]\)

复杂度\(O(n^3)\)怎么算出来的:枚举每一个\(i\),将其放在最后,然后计算\(f\),一共是\(O(n\cdot n^2)=O(n^3)\)

最后倒着求那里,\(f[k-1][j]\)不应该放在分子那里,应该是\(f[k-1][j]\)等于后面那一坨分数;至于倒着求怎么想到的,我们最开始利用了换序来考虑整体,所以整体是不变的,可以考虑利用这个不变量

update 2024.5.4

自己独立做出来啦,所以要相信自己呀

首先来看第二问吧,根据我们对期望的理解(这个理解具体见罗森的离散数学教材),直接暴力DP每个时刻每个人不同血量的概率就好了

然后是第一问,就像先前所说的一样,用组合数的话时间复杂度太大了,此时考虑DP,我们现在要知道的信息就是被选中的\(k\)个人中有\(j\)个人还活着的概率,所以设\(f[i][j]\)表示前\(i\)个人活着\(j\)个人的概率是多少(跟题解里面的一样,注意题解里面有\(alive+dead=1\);然后具体写代码的时候也可以把不是这\(k\)个人里面的人考虑进来,只不过不影响答案,有\(f[i][j]=f[i-1][j]\)而已);然后由于所有人是独立的,现在我们要确定一个具体的人活着且其他若干个人活着的概率,可以考虑将我们确定的这个人放在最后用类似的过程DP,但是这样肯定会超时间复杂度,所以我们先写出式子,有\(f[n][j]=alive\times (其余人中有j-1个人活的概率)+dead\times (其余人中有\)j\(个人活的概率)\),那么\(0\)个人活得glv我们是可以直接计算得到的,所以我们可以将括号中的概率求出来(注意一个细节,如果某个时刻dead为\(0\)要特殊考虑)

posted @ 2024-03-10 21:28  最爱丁珰  阅读(2)  评论(0编辑  收藏  举报