Brackets
We give the following inductive definition of a “regular brackets” sequence:
- the empty sequence is a regular brackets sequence,
- if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and
- if a and b are regular brackets sequences, then ab is a regular brackets sequence.
- no other sequence is a regular brackets sequence
For instance, all of the following character sequences are regular brackets sequences:
(), [], (()), ()[], ()[()]
while the following character sequences are not:
(, ], )(, ([)], ([(]
Given a brackets sequence of characters a1a2 … an, your goal is to find the length of the longest regular brackets sequence that is a subsequence of s. That is, you wish to find the largest msuch that for indices i1, i2, …, im where 1 ≤ i1 < i2 < … < im ≤ n, ai1ai2 … aim is a regular brackets sequence.
Given the initial sequence ([([]])], the longest regular brackets subsequence is [([])].
Input
The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters (, ), [, and ]; each input test will have length between 1 and 100, inclusive. The end-of-file is marked by a line containing the word “end” and should not be processed.
Output
For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line.
Sample Input
((()))
()()()
([]])
)[)(
([][][)
end
Sample Output
6
6
4
0
6
Source
题目类型:区间DP
算法分析:使用数组dp[i][j]表示下标从ai~aj中匹配的括号的个数,然后对于每一个ak(i <= k <= j),如果ai和ak是匹配的,则dp[i][j] = max (dp[i][j], dp[i+1][k-1] + dp[k+1][j] + 2)
否则dp[i][j] = max (dp[i][j], dp[i+1][j]),初始时dp[i][i] = 0,最后输出dp[0][len-1],其中len表示字符串的长度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#include <set> #include <bitset> #include <list> #include <map> #include <stack> #include <queue> #include <deque> #include <string> #include <vector> #include <ios> #include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <algorithm> #include <utility> #include <complex> #include <numeric> #include <functional> #include <cmath> #include <ctime> #include <climits> #include <cstdarg> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cassert> #define lson rt << 1, l, m #define rson rt << 1 | 1, m + 1, r using namespace std; const int INF = 0x7FFFFFFF; const double EPS = 1e-10; const double PI = 2 * acos (0.0); const int MOD = 7; const int maxn = 500 + 66; char ans[maxn]; int dp[maxn][maxn]; int main() { // ifstream cin ("aaa.txt"); while (cin >> ans) { if (!strcmp (ans, "end")) break; int len = strlen (ans); memset (dp, 0, sizeof (dp)); for (int i = 2; i <= len; i++) { for (int j = 0; j + i - 1 < len; j++) { int temp = j + i - 1; for (int k = j; k <= temp; k++) { if ((ans[j] == '(' && ans[k] == ')') || (ans[j] == '[' && ans[k] == ']')) dp[j][temp] = max (dp[j][temp], dp[j+1][k-1] + dp[k+1][temp] + 2); else dp[j][temp] = max (dp[j][temp], dp[j+1][temp]); } } } cout << dp[0][len-1] << endl; } return 0; } |
- « 上一篇:poj2891
- poj2992:下一篇 »