快乐的一天从AC开始 | 20210628 | ABC207E

题目链接

AC代码

考虑使用DP解决这题。

(dp_{i, j})表示将前(i)个元素分为(j)个连续子序列的方法数,记(s_i = sum_{j = 1}^{i} a_i),那么有转移方程

[dp_{i, j} = sum_{k = 1}^{i} [s_i - s_k equiv 0 mod j] dp_{k, j - 1} ]

很容易得出一个(O(n^3))的DP方法,但是这个做法明显会超时。

注意到(s_i - s_k equiv 0 mod j)等价于(s_i equiv s_k mod j),所以转移方程可以写作

[dp_{i, j} = mem_{j, s_i \% j} ]

其中,(mem_{i, j})表示满足(s_k equiv j mod i)(dp_{k, i - 1})之和。

这一步记录了额外信息,用空间换时间。

现在就可以(O(n^2))做了。

原文地址:https://www.cnblogs.com/zengzk/p/14943305.html