Brackets:最长合法括号子序列
题意
题目来源:POJ 2955 — Brackets。
给定一个只包含 (、)、[、] 的字符串,可以删除一些字符,但不能改变剩余字符的顺序。求能留下的最长合法括号序列的长度。输入包含多组数据,遇到 end 结束;每组输出一个答案。
做法
用区间 DP。设 dp[i][j] 表示从第 i 个字符到第 j 个字符中,最多能选出多少个字符组成合法括号序列。单个字符不能配对,所以长度为 1 的区间答案是 0。
计算一个区间时,考虑两种情况:
- 如果两端是匹配的
()或[],就把它们选上,得到dp[i+1][j-1]+2。 - 也可以从中间某处把区间分成左右两段,分别求答案再相加。枚举所有分割位置,取最大值。
按区间长度从小到大计算,最后输出 dp[0][n-1]。时间复杂度为 O(n^3),空间复杂度为 O(n^2)。
C++ 代码
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 hybrz的博客!