AmazingCounters.com

POJ 1141 Brackets Sequence

Brackets Sequence
Time Limit: 1000MS   Memory Limit: 65536K
        Special Judge

Description

Let us define a regular brackets sequence in the following way:

1. Empty sequence is a regular sequence.
2. If S is a regular sequence, then (S) and [S] are both regular sequences.
3. 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 a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.

Input

The input file contains at most 100 brackets (characters '(', ')', '[' and ']') that are situated on a single line without any other characters among them.

Output

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

([(]

Sample Output

()[()]

Source

 
区间dp记录路径,结合了上两题的括号匹配+回文串修改。。
注意空行
 1 #include<set>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 const int N = 110;
 9 #define For(i,n) for(int i=1;i<=n;i++)
10 #define Rep(i,l,r) for(int i=l;i<=r;i++)
11 #define Down(i,r,l) for(int i=r;i>=l;i--)
12 
13 struct State{
14     int v,op;
15 }dp[N][N];
16 
17 char st[N];
18 int n;
19 
20 bool match(int x,int y){
21     if(st[x]=='(') return (st[y]==')');
22     if(st[x]=='[') return (st[y]==']');
23     return false;
24 }
25 void DP(){
26     n=strlen(st+1);
27     For(i,n)
28       For(j,n)
29         if(j<i)  dp[i][j].v=0;
30         else     dp[i][j].v=214748364;
31     For(i,n) dp[i][i].v=1;
32     Down(i,n-1,1)
33       Rep(j,i,n){
34           if(match(i,j))
35             if(dp[i][j].v>dp[i+1][j-1].v){
36                 dp[i][j].v=dp[i+1][j-1].v;
37                 dp[i][j].op=0;
38             }
39           Rep(k,i,j-1)
40             if(dp[i][k].v+dp[k+1][j].v<dp[i][j].v){
41                 dp[i][j].v=dp[i][k].v+dp[k+1][j].v;
42                 dp[i][j].op=k;
43             }
44       }
45 }
46 
47 void Print(int l,int r){
48     if(l>r) return;
49     if(l==r){
50         if(st[l]=='('||st[l]==')') printf("()");
51         if(st[l]==']'||st[l]=='[') printf("[]");
52         return;
53     }
54     if(dp[l][r].op){
55         Print(l,dp[l][r].op);
56         Print(dp[l][r].op+1,r);
57     }
58     else{
59         printf("%c",st[l]);
60         Print(l+1,r-1);
61         printf("%c",st[r]);
62     }
63 }
64 
65 int main(){
66     while(gets(st+1)){
67         if(strlen(st+1)){
68             DP();
69             Print(1,n);
70         }
71         puts("");
72     }
73     return 0;
74 }

 

posted @ 2014-10-27 10:52  ZJDx1998  阅读(136)  评论(0编辑  收藏  举报