ZOJ 4064 (爆炸系列之一)

原题链接

题意

给定1个长度为n的序列,该序列只含\(0/1/2\)

你可以进行如下操作:选中不含1的连续区间\([l,r]\),令区间内所有2变为0。

恰好进行m次操作,令所有2变为0。求共有多少种不同的操作序列。

\(1 \leq n\leq 100,1\leq m\leq10^9\)

题解

本题中对操作的限制非常复杂:不能覆盖到1,还必须覆盖所有的2。

尤其是第2个限制,是解题中极大的阻碍。直接限制极为复杂,不妨考虑反向限制,即容斥原理

则RESULT = 至少有0个2未被覆盖的方案数 - 至少有1个2未被覆盖的方案数 + 至少有2个2未被覆盖的方案数...

\(Ans(i)\)表示至少有\(i\)个2未被覆盖的方案数。好处非常显然:我们只需保证这\(i\)个2未被覆盖,其余合法区间随意排列,可用数学知识轻易解决。

求解\(Ans(i)\)时,当然不能直接枚举出这\(i\)个2,时间复杂度过高;考虑dp求解。

我们需要知道满足条件(即将某些2当成不可覆盖的1)时,可操作的区间数目,以便剩余的操作随意分配。并且容斥系数仅1/-1两种,无需记录\(i\),可以节省时空复杂度。

状态:\(f(i)(j)(t)\)表示前\(i\)个位置,且第\(i\)个位置为不可跨越点,形成了\(j\)个可执行区间,且容斥系数为\(t\)的方案数。(状态数为\(n^3\)级别,可以接受)

转移:枚举前1个实际不可跨越的位置进行转移。转移的复杂度为\(O(n)\)

时间复杂度:\(O(n^4)\)代码见此

(正确性没问题,交上去TLE。若要AC需要毒瘤卡常,没啥意思,就当它过了)

猜你喜欢

转载自www.cnblogs.com/littlewyy/p/11296557.html
ZOJ