【题解】P5359 dp优化 复杂度分析
一个可以做到线性的办法。
给你一个 的网格图,有些点已经被着色,求这个图的 染色方案数。
考虑只有一行怎么做?
表示点 颜色为 的方案数。
把 dp 拍了,只管第二维。
转移每步转移到其他颜色,相当于求全局和 ,再将每个元素置为 ,再加上一个全局置零。
可以通过 维护一个全局标记 ,这是可并的,同时维护 的逆元,复杂度线性。
很困难的问题就是如果有两行怎么办,很难避免记录两个格子的颜色,如果记录了复杂度完全没办法降低。怎样才能只记录一个格子的颜色呢?
考虑在有一个位置被染色的列断开,进行 dp,这样两个断点之间都是空白的区域,而在断点处有至少一个格子的颜色是确定的,记录另一个即可。
两个断点之间的方案数如何计算?
分情况:
100..001
a00..00b
100..002
a00..00b
100..00b
a00..002
100..00b
a00..001
总共只有四种本质不同的情况,每种情况对于某个 ,转移的方案数不同的 只有 种 : 或 或 。
这是可以预处理的(因为有意义的颜色只有 种),直接记录两个位置的值暴力 dp 与处理出来即可。
这样可以做到 ,还是把 dp 拍了,考虑 的变化:
有区别的 也只有 种,其它像其它转移到系数都是相同的,只有转移到自己的系数是不同的。
也就是 除去那 个值,剩下的值还是进行的是一个线性变换,令转移到 的系数是 ,转移到其它值的系数是 ,那么就是 , 表示所有不为那 个 的 值之和。
这是一个线性变换,是可并的,维护形如线段树 2 的 tag 即可。
然后这个过程总共还有 次单点修改 和 全局清空。
因为不方便修改全局 tag,所以修改当前值,解出 的 赋值即可,所以我们需要保持 非 ,否则会没有逆元,当 时直接当作全局清空后赋值为 , 不变即可。
时间复杂度 ,瓶颈在求逆元。
然后可以用在线 科技求逆元。
(那玩意常数太大了,怎么可能。)
考虑缩减求逆元的次数,我们每次乘上去的 一定是预处理出来的某种长度的方案数,求出每次的逆元,再维护一个 的逆元。
因为不同的长度只会有 种,所以维护的逆元只有 个。
复杂度线性。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970906,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步