UVA1626/ZOJ1463 Brackets sequence interval DP
Simple interval DP (empty string ......)
Brackets sequence
Time Limit:4500 MS |
|
Memory Limit:Unknown |
|
64bit IO Format:% Lld & % llu |
Submit Status
Description
Let us define a regular brackets sequence in the following way:
Empty sequence is a regular sequence. if S is a regular sequence, then (S) and [S] are both regular sequences. if A and B are regular sequences, then AB is a regular sequence.
For example, all of the following sequences of characters are regular brackets sequences:
(),[],(()),([]),() [],() [()]
And all of the following character sequences are not:
(,[,),)(,([)],([(]
Some sequence of characters '(', ')', '[', and'] 'is given. you are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. here, a string a1a2... an is called a subsequence of the string b1b2... bm, if there exist such indices 1 ≤ i1 <i2 <... <in ≤ m, that aj = bij for all 1 ≤ j ≤ n.
Input
The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. this line is followed by a blank line, and there is also a blank line between two consecutive inputs.
The input file contains at most 100 brackets (characters '(', ')', '[' and ']') that are situated on a single line without any other characters among them.
Output
For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.
Write to the output file a single line that contains some regular brackets sequence that has the minimal possible length and contains the given sequence as a subsequence.
Sample Input
1([(]
Sample Output
()[()]
Source
Root: aoapc ii: Beginning Algorithm Contests (Second Edition) (Rujia Liu): Chapter 9. Dynamic Programming: Examples
Submit Status
/*************************************** * ******** Author: CKbossCreated Time: October 16 File Name: ZOJ1463.cpp *************************************** * *********/# include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
Using namespace std; const int maxn = 300; const int INF = 0x3f3f3f; char str [maxn]; int n; int dp [maxn] [maxn]; bool match (int, int B) {if (str [a] = '(' & str [B] = ')') | (str [a] = '[' & str [B] = ']') return true; return false;} void PRINT (int l, int r) {if (l = r) {if (str [l] = '(' | str [l] = ')') {putchar (');} if (str [l] =' ['| str [l] ='] ') {putchar ('['); putchar (']');} return;} else if (l> r) return; int pos =-1; int temp = INF; if (match (l, r) temp = dp [l + 1] [r-1]; for (int I = l; I + 1 <= r; I ++) if (dp [l] [I] + dp [I + 1] [r]
J) dp [I] [j] = 0; for (int len = 2; len <= n; len ++) {for (int I = 0; I + len-1