快乐的一天从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)\)做了。

posted @ 2021-06-28 10:21  _Backl1ght  阅读(68)  评论(0编辑  收藏  举报