链接
题意
给你包含小括号和中括号括号序列,求最长合法括号子序列的长度。合法的括号序列满足如下条件:
- 空的括号序列是合法的;
- 如果一个括号序列\(s\)是合法的,那么\((s)、[s]\)也都是合法;
- 如果\(a、b\)是合法的,那么\(ab\)也是合法的;
- 其他括号序列都是不合法的;
括号序列长度\(\text N\),\(1\leq \text{N}\leq100\)。
分析
这是一道区间\(\text{DP}\)题目,对于某个序列,如\([xxx]oooo\),它被分成两部分,\(xxx\)和\(oooo\);
设\(dp[i][j]\)表示\([i,j]\)之间的最长合法括号子序列的长度,那么如果\([i+1,j]\)内没有与\(i\)匹配的括号,则\(dp[i][j]=dp[i+1][j]\),若存在一个\(k\)与之匹配,那么\(dp[i][j]=\max\{dp[i+1][j],dp[i+1][k-1]+dp[k+1][j]+2\}\)(\(i\)与\(k\)匹配),区间长度从小到大枚举,最终\(dp[1][\text{N}]\)即是答案。
代码
1 |
|