由P7914括号序列(A题)引发的关于区间DP的思考

发布时间 2023-08-23 22:03:19作者: Zlc晨鑫

CF149D Coloring Brackets(B题)一样,都是关于括号的区间DP。

在B题中,有一个细节,就是在枚举断点时枚举到第一个就要break,这是为了使每种方案只贡献一次,防止一种方案中有多个符合条件的断点。

此题中,因为序列的字符是不变的,所以直接break就行了。

但是在A题中,情况变得比较复杂,比如一个序列??????

合法的方案有:

()()()
(())()

如果依然枚举到第一个断点就break,就统计不到第二个方案。

但是又不能对第一个方案重复统计。

此时必须保证对于每一个方案,仅统计一次,也就是只在第一个断点处枚举一次。

我们需要去做的,就是推算出这第一个断点有什么性质。

需要注意的是,如果一道题有多种合并区间的方式,并且可以嵌套,应该把它们综合起来考虑。

比如,只考虑AB型的字符串,第一个断点就是内部没有AB结构的前缀。
只考虑ASB型字符串,第一个断点就是内部没有ASB结构的前缀。

但是这二者可以嵌套,比如

()()*()

既是AB型,又是ASB型,如果对这两种转移分别统计,会造成重复。

综合起来考虑,总的合法方案应该是:A1+A2+...,然后在A中间插入S。

这样子,第一个断点处就是没有AB结构也没有ASB结构的前缀。

也就是除了这两个嵌套的方案数。

然后看一下断点后面的方案数:

可能有*:就是sa
可能是(...):就是f

这样就解决了问题,也就是说,以后写区间DP,一定要注意这种区间合并操作的第一个断点原则。

原则:只在第一个断点处统计!!!