Loading

CF1975I Mind Bloom

dp 好题。

首先,读完题后,就感觉很不可做,我们可以考虑正难则反,算输光的概率,这样可以想出一个暴力状压 dp 的做法,但是考场上连状压再高消的分都没给。

我们考虑设计一个巧妙的状态去描述这个局面,注意,设计状态的范围是很广的。我们发现我们输光的过程的 max(S) 长成一个折线图,最后归为 0。并且,每张牌被选中的概率是一定的,我们可以针对这些性质,压缩冗余的状态。

直觉告诉我们,max(S) 显然是最重要的,我们考虑在状态里只加入 max(S),再观察形似折线图的过程,我们发现对于一个状态,如果我们在下一次随机选牌的时候 max(S) 变小了,那么再进入下一个状态,而如果 max(S) 变大了,我们仍然不需要 <max(S) 的牌。

所以,这时脑子里我们可以出现一个大致的 dp 状态,为了使得不同状态在概率上是本质相同的,我们不仅要记录 max(S),还要记录一下我们当前拥有的牌数,并且为了转移,还要记录下一个状态的牌数,即记 fi,x,y 表示当前 max(S) 在第 i 位,且当前除了最大值以外我们手里还有 x 张牌,第一次到 max(S) 小于当前最大的概率(换句话说,就是在折线图中第一个在该点右边的,且低于当前点的), 然而该过程是波折的,我们还要记一个辅助 dp 数组,gj,y 表示从 (i,x) 这个状态随机到 max(S)j|S|=y 的概率,显然 gn,x+ci=1,且 fi,x,y=gi1,y。接下来就是转移的事情了,我们试着推出转移方程式。

这个状态中,每个数被选择的概率均是 p=yxjx,因为首先显然对于初始的 x 张牌我们永远不会打出,所以这些不在选择里,所以概率是这个。

考虑 gj,y 的贡献。如果这个状态下手里没有第 j 张牌,gj1,ygj,y×p

然后,如果有的话,对于 gj1,z,有 gj1,z(1p)×gj,y×fj,y1,z

惊奇的发现,哇,他们是可以互相转移的!且转移大体是个 DAG,不需要高消,但为什么是大体呢,因为我们发现,当 i=j,x=y1 时,fi,x,y 贡献了自己,我们把他记录成 fi,x,y=k×fi,x,y+b,最后再移项就好了。

那么接下来,答案该怎么求呢?我们设一个类似于 g 的状态,记 hi,x 表示对于原序列中前 i 个,选择了一些必选(初始手里就有的),和一些之后选择的,总数为 x 张牌最后输光的概率,他很好转移:

si=1 时,我们只能选,那么转移为 hi,x=fi,x1,y×hi1,y

si=0 时,我们有 p=xsumnisumn 选择它,那么转移为 hi,x=(1p)hi1,x+pfi,x1,y×hi1,y

最后 ans=1hn,sumn,然后我们就做完了!时间复杂度为 O(n5),稍微加点优化就能通过。

提交记录

作者:lalaouye

出处:https://www.cnblogs.com/lalaouyehome/p/18378619

版权:本作品采用「114514」许可协议进行许可。

posted @   lalaouye  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示