// source code of submission 343733, Zhongshan University Online Judge System #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <stack> using namespace std; const int inf = 1<<28; char str[1000]; int dp[1000][1000]; int f[1000][1000]; void print(int i,int j){ if (i>j) return ; if (i==j) { if (str[i] == '(' || str[i] == ')') printf("()"); else printf("[]"); return ; } if (f[i][j] == -1){ printf("%c",str[i]); print(i+1,j-1); printf("%c",str[j]); return ; } print(i,f[i][j]-1); print(f[i][j],j); } int main() { int length,temp; while (gets(str)){ length = strlen(str); if (length==0){ printf("/n"); continue; } memset(dp,0,sizeof(dp)); memset(f,0,sizeof(f)); for (int i=0;i<length;i++) for (int j=i+1;j<length;j++) dp[j][i]= inf; for (int i=0;i<length;i++) { dp[i][i] = 1; if (str[i] == '(' || str[i]=='[') f[i][i] = i; else f[i][i] = i+1; dp[i+1][i] = 0; } for (int len = 2;len<=length; len++) for (int i=0;i<=length-len;i++){ int j = i+len-1; dp[i][j] = inf; if (str[i] == '(' && str[j] == ')' || str[i]=='[' && str[j]==']') { if (dp[i][j]>dp[i+1][j-1]){ dp[i][j] = dp[i+1][j-1]; f[i][j] = -1; } } for (int k=i+1;k<=j;k++){ if (dp[i][k-1]+dp[k][j]< dp[i][j]){ dp[i][j] = dp[i][k-1]+dp[k][j]; f[i][j] = k; } } } print(0,length-1); printf("/n"); } system("pause"); return 0; }