UVA1626/ZOJ1463 Brackets sequence interval DP, uva1626zoj1463
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:
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 <iostream> # include <cstdio> # include <cstring> # include <algorithm> # include <string> # include <cmath> # include <cstdlib> # include <vector> # include <queue> # include <set> # include <map> using namespace std; const int maxns = 300; const int INF = 0x3f3f3f3f; char str [maxn]; int n; int dp [maxn] [maxn]; bool match (int a, 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] <temp) {pos = I; temp = dp [l] [I] + dp [I + 1] [r];} if (pos =-1) {putchar (str [l]); PRINT (l + 1, R-1); putchar (str [r]);} else {PRINT (l, pos); PRINT (pos + 1, r );}} int main () {// freopen ("in.txt", "r", stdin); // freopen ("out.txt", "w", stdout); int T_T, flag = 0; scanf ("% d", & T_T); getchar (); while (T_T --) {gets (str); memset (str, 0, sizeof (str); gets (str); n = strlen (str); if (n = 0) {if (flag ++) putchar (10 ); putchar (10); continue;} // DPmemset (dp, 63, sizeof (dp); for (int I = 0; I <n; I ++) dp [I] [I] = 1; for (int I = 0; I <n; I ++) for (int j = 0; j <n; j ++) if (I> j) dp [I] [j] = 0; for (int len = 2; len <= n; len ++) {for (int I = 0; I + len-1 <n; I ++) {// I... jint j = I + len-1; if (match (I, j) dp [I] [j] = min (dp [I] [j], dp [I + 1] [J-1]); for (int k = I; k + 1 <= j; k ++) dp [I] [j] = min (dp [I] [j], dp [I] [k] + dp [k + 1] [j]);} if (flag ++) putchar (10); PRINT (0, n-1); putchar (10);} return 0 ;}