加载中...

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\) 个字符是确定的,将其去掉即为所求,构成一一映射)。

code

posted @ 2025-11-30 12:04  jxs123  阅读(42)  评论(0)    收藏  举报