考场挂分器,送分题变成送命题。
一、状态:
令 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 [ i , j ] [i, j] [i,j] 这个区间内组成超级括号序列的方案数
令 f [ i ] [ j ] f[i][j] f[i][j] 表示在 d p [ i ] [ j ] dp[i][j] dp[i][j] 的要求上,添加限制:方案中,括号 i i i, j j j 匹配。
令 a n s [ i ] [ j ] ans[i][j] ans[i][j] 表示 [ i , j ] [i, j] [i,j] 这个区间能不能做到 [ l , r ] [l, r] [l,r] 全为 “*”。
令 c h e c k ( l , r ) = [ [ [ s [ l ] = ? ] ∨ [ s [ l ] = ∗ ] ] ∧ [ [ s [ r ] = ? ] ∨ [ s [ r ] = ∗ ] ] ] check (l, r) = \bigg[ \Big[ [s[l] = ?] \lor [s[l] = *] \Big] \wedge \Big[ [s[r] = ?] \lor [s[r] = *] \Big] \bigg] check(l,r)=[[[s[l]=?]∨[s[l]=∗]]∧[[s[r]=?]∨[s[r]=∗]]]
attention: 这里区间的含义和数学上是一样的,不会是空集。
二、初始化:
a n s ans ans 即判断这个区间内是不是全是 “?” 或 “*”。 d p , f dp, f dp,f 全部设为 0 0 0。
三、状态转移:
考虑所有情况,每种情况对应一种转移。
- ()
这种情况特判即可。
d p [ l ] [ r ] = f [ l ] [ r ] = c h e c k ( l , r ) ∗ [ l + 1 = = r ] dp[l][r] = f[l][r] = check (l, r) * [l + 1 == r] dp[l][r]=f[l][r]=check(l,r)∗[l+1==r]
- (S)
这是 s [ l ] , s [ r ] s[l], s[r] s[l],s[r] 已经匹配好了,则 [ l + 1 , r − 1 ] [l + 1, r - 1] [l+1,r−1] 全为 * 就行了。
d p [ l ] [ r ] = f [ l ] [ r ] = a n s [ l + 1 ] [ r − 1 ] dp[l][r] = f[l][r] = ans[l + 1][r - 1] dp[l][r]=f[l][r]=ans[l+1][r−1]
- (SA)
我们枚举 S 的最后一个字符的位置。
即统计 [ l + 1 , i ] [l + 1, i] [l+