样例:
1
([(]
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=1<<30;
const int maxn=110;
int f[maxn][maxn];
int pd(char x,char y){
if (x=='('&&y==')'||x=='['&&y==']') return 1;
return 0;
}
char s[maxn];
int n;
void print(int i,int j){
if (i>j) return ;
if (i==j){
if (s[i]=='('||s[i]==')') cout<<"()";
else cout<<"[]";
return;
}
int ans=f[i][j];
if (pd(s[i],s[j])&&ans == f[i+1][j-1]) {
cout<<s[i];
print(i+1,j-1);
cout<<s[j];
return;
}
for (int k=i;k < j;k++)
if (ans==f[i][k]+f[k+1][j]){
print(i, k);
print(k+1,j);
return ;
}
}
void dp(){
for (int i=0;i<n;i++){
f[i+1][i]=0;
f[i][i]=1;
}
for (int i=n-1;i>=0;i--)
for (int j=i+1;j<n;j++){
f[i][j]=n;
if (pd(s[i],s[j]))
f[i][j]=min(f[i][j],f[i+1][j-1]);
for (int k=i;k<j;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
}
int main(){
int t,i,j,ox=0;
cin>>t;
gets(s);
while (t--){
gets(s);
gets(s);
n=strlen(s);
if (!n){
if (ox) cout<<endl;
ox++;
cout<<endl;
continue;
}
dp();
if (ox) cout<<endl;
print(0,n-1);
ox++;
cout<<endl;
}
}