COCI20102011 Contest Final D (Dp)
COCI20102011 Contest#Final D (dp)
我们将一个操作序列看做由左右括号,空格构成的字符串,则序列大致长这个样子
$\text{_ ( ( ) _ ( ) ) ( _ ( ( ) ) ( }$
很显然,一个失配的左括号只能在最外层出现,而空格可以出现在任意位置
dp一个括号序列让人想到区间dp,但是这个题目的区间实际只需要用长度就可以描述
令$dp[t][l][r][f1][f2]$表示用$t$的时间从$l$走到$r$,$f1$表示是不是最外层括号,$f2$表示当前$dp$是否受到单纯括号序列的限制
其中,引入的单纯括号序列是为了防止出现重复转移,其意思就是这个括号序列两端必须是一对匹配的左右括号,而中间随意
转移大致如下:
1.那么对于非单纯的括号序列,可以在序列插入空格或者失配的左括号(需要满足$f1$),从$dp[t-1]$转移过来
2.对于任何的括号序列,都可以在两端找到匹配的的左右括号,从$dp[t-2]$转移过来,且完成匹配后$f1$应为$0$
3.且一个非单纯的括号序列是可以分割的,为了不重复,强制分割的左序列是单纯的即可
实际会发现,一个单纯的括号序列可以认为一定不是最外层括号,即$f2$为真时,$f1$一定为假,所以可以压缩为三种状态
1 |
|