dp 好题。
首先,读完题后,就感觉很不可做,我们可以考虑正难则反,算输光的概率,这样可以想出一个暴力状压 dp 的做法,但是考场上连状压再高消的分都没给。
我们考虑设计一个巧妙的状态去描述这个局面,注意,设计状态的范围是很广的。我们发现我们输光的过程的 长成一个折线图,最后归为 。并且,每张牌被选中的概率是一定的,我们可以针对这些性质,压缩冗余的状态。
直觉告诉我们, 显然是最重要的,我们考虑在状态里只加入 ,再观察形似折线图的过程,我们发现对于一个状态,如果我们在下一次随机选牌的时候 变小了,那么再进入下一个状态,而如果 变大了,我们仍然不需要 的牌。
所以,这时脑子里我们可以出现一个大致的 dp 状态,为了使得不同状态在概率上是本质相同的,我们不仅要记录 ,还要记录一下我们当前拥有的牌数,并且为了转移,还要记录下一个状态的牌数,即记 表示当前 在第 位,且当前除了最大值以外我们手里还有 张牌,第一次到 小于当前最大的概率(换句话说,就是在折线图中第一个在该点右边的,且低于当前点的), 然而该过程是波折的,我们还要记一个辅助 dp 数组, 表示从 这个状态随机到 且 的概率,显然 ,且 。接下来就是转移的事情了,我们试着推出转移方程式。
这个状态中,每个数被选择的概率均是 ,因为首先显然对于初始的 张牌我们永远不会打出,所以这些不在选择里,所以概率是这个。
考虑 的贡献。如果这个状态下手里没有第 张牌,。
然后,如果有的话,对于 ,有 。
惊奇的发现,哇,他们是可以互相转移的!且转移大体是个 DAG,不需要高消,但为什么是大体呢,因为我们发现,当 时, 贡献了自己,我们把他记录成 ,最后再移项就好了。
那么接下来,答案该怎么求呢?我们设一个类似于 的状态,记 表示对于原序列中前 个,选择了一些必选(初始手里就有的),和一些之后选择的,总数为 张牌最后输光的概率,他很好转移:
当 时,我们只能选,那么转移为 。
当 时,我们有 选择它,那么转移为 。
最后 ,然后我们就做完了!时间复杂度为 ,稍微加点优化就能通过。
提交记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?