edu185 E(dp)
E. Binary Strings and Blocks
一道看起来很板,很典型的 \(dp\)。大概形式就是:对长度为 \(n\),且给定的 \(m\) 个区间都满足某一性质的序列计数。这种问题一般都可以通过 \(dp\) 来求。
在本题中,要求给定的 \(m\) 个区间 \(0\) 和 \(1\) 两种字符必须都包含。
首先对于每组右端点重合的区间,我们只需要保留下来长度最短的区间(即左端点最大的区间)就可以了。因为小区间满足,大区间肯定也满足。于是我们记录下来每个位置 \(i\) 的最大左端点 \(maxl_{i}\)。
然后我们对 \(maxl\) 做一遍前缀最大值,此时 \(maxl_{i}\) 的含义:考虑给定 \(m\) 条线段的所有 \(r \leq i\) 的线段 \([l,r]\),左端点 \(l\) 的最大值。
状态定义:\(dp_{i}:\) 考虑前 \(1 \backsim i\) 个字符,其中第 \(i-1\) 个字符与第 \(i\) 个字符不同,方案数。
考虑如何状态转移:首先对于右端点为 \(i\) 的所有线段,已经都满足了性质。那么我们仅需考虑右端点 \(< i\) 的线段就可以了。
考虑可以从哪些位置转移过来:设 \(1 \backsim i - 1\) 中,最后一个不同的字符对的结尾位置为 \(j\)(即 \([j, i - 1]\) 内的所有字符均相同),那么:
- 如果 \(j \leq maxl_{i - 1}\),那么在 \([j, i - 1]\) 内必然存在某条线段字符都相同。因此这样的位置 \(j\) 不能作为转移点。
- 否则 \(j > maxl_{i - 1}\),在 \([j, i - 1]\) 内就不存在任何 \(r < i\) 的线段。此时 \([j, i - 1]\) 内的所有位置都可以作为转移点,代表 \([1, i - 1]\) 内最后一个不同字符对的结尾位置(之后的字符都相同)。
综上,状态转移式可写作:
\[dp_{i} = \sum_{j=maxl_{i-1}+1}^{i-1} dp_{j}
\]
前缀和优化 \(dp\) 即可。最终答案为 \(dp_{n+1}\)(要求第 \(n\) 个字符与第 \(n+1\) 个字符不同,那么对于所有长度为 \(n\) 的合法方案,第 \(n+1\) 个字符是确定的,将其去掉即为所求,构成一一映射)。

浙公网安备 33010602011771号