【题解】2021牛客OI赛前集训营-提高组(第三场)C. 打拳
需要一些脑洞。
充分体现了本蒟蒻 dp 菜的本质。
考虑 k=1 的情况。这种情况等价于,从 叶子结点 1 到根节点的所有祖先都被收买,且满足祖先节点都是子树的最大值。
那么我们考虑设 dp[i][j] 表示处理了前 i 个被收买的人,其中 j\in [0,2^n) 表示每个位置上的数是否被选择。转移时就找到一个不为 1 的位置,假设为 k,那么乘上一个组合数 ( b e a t [ i ] − c n t [ j ] − 2 2 k − 1 ) \binom{beat[i]-cnt[j]-2}{2^k-1} (2k−1beat[i]−cnt[j]−2) 以及 beat[i] 子树内部的顺序 ( 2 k ) ! (2^k)! (2k)! 。
最后我们要注意到其实 1的位置并没有固定 ,所以要乘上 2 n 2^{n} 2n 。
时间复杂度 o ( 2 n n m ) o(2^nnm) o(2nnm) ,期望得分 50pts 。(能做到这一步已经很优秀了 qwq)
代码量不大。但是很有效。
为了得到 100pts ,我们还需要对 LIS 进行转移 (其实这里思维难度不大,就是比较繁琐)
考虑怎么求一个序列的 LCS (我们重新定义求法)
从小到大考虑,每个位置的 LCS = i 前面 LCS 的最大值 + 1
这样我们考虑到序列长度还是 n ,总状态数只有区区 120000
所以时间复杂度为 o ( 120000 n m ) o(120000nm) o(120000nm) 可以通过。实际实现时要先写一个 dfs 把所有合法状态搜出来方便转移。
代码参见 std 。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530219.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」