CF1920E 题解

CF1920E

被这种题卡了,脸都不要了。

仔细读题,发现序列可以分成两部分(\(0\)\(1\))来考虑。

在合法序列中,对于一个 \(1\),它产生的子串贡献一定是(假设与上一个 \(1\) 之间有 \(x\)\(0\),与下一个 \(1\) 之间有 \(y\)\(0\)):

\[(x+1)(y+1) \]

如果去 DP 这 \(n\)\(1\),易得转移方程:

\[f_{i,j}=\sum f_{i-p\times j,p} \]

\(f_{i,j}\) 表示:当前贡献了 \(i\) 个合法子串,上一个 \(1\) 到现在的 \(1\) 的长度为 \(j\) 的组成序列方案数。

接下来考虑 \(p\) 的值域。

要使式子成立,有:\(p\in [1, \frac{i}{j}]\)

考虑题目限制(最长合法串长度不大于 \(k\)),有:\(p\in [1,k+1-j]\)

所以 \(p\in [1,\min\{\frac{i}{j},k+1-j\}]\),即:

\[f_{i,j}=\sum\limits_{p=1}^{\min\{\frac{i}{j},k+1-j\}} f_{i-p\times j,p} \]

code

posted @ 2024-01-22 11:48  一棵油菜花  阅读(13)  评论(0编辑  收藏  举报