和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,一定要注意这种区间合并操作的第一个断点原则。
原则:只在第一个断点处统计!!!
标签:方案,第一个,P7914,括号,枚举,区间,断点,DP From: https://www.cnblogs.com/zhangchenxin/p/17652899.html