求大佬解答QAQ
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s;
int n,t,d[110][110];
void print(int i,int j);
void dp();
bool match(char a,char b);
int main()
{
scanf("%d",&t);getchar();
while(t--)
{
// memset(d,0x3f,sizeof d);
getline(cin,s);
n=s.size();
dp();
print(0,n-1);
printf("\n");
if(t)putchar('\n');
}
}
bool match(char a,char b)
{
if(a==' '&&b==' ') return 1;
if(a=='('&&b==')') return 1;
else if(a=='['&&b==']') return 1;
else return 0;
}
void dp()
{
for(int i=0;i<n;i++)
{
d[i+1][i]=0;
d[i][i]=1;
}
for(int i=n-2;i>=0;i--)
{
for(int j=i+1;j<n;j++)
{
d[i][j]=n;
if(match(s[i],s[j])) d[i][j]=min(d[i][j],d[i+1][j-1]);
for(int k=i;k<j;k++)
d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]);
}
}
}
void print(int i,int j)
{
if(i>j) return ;
if(i==j)
{
if(s[i]=='('|| s[i]==')')printf("()");
else printf("[]");
return;
}
int ans=d[i][j];
if(match(s[i],s[j])&&ans==d[i+1][j-1])
{
printf("%c",s[i]);print(i+1,j-1);printf("%c",s[j]);
return;
}
for(int k=i;k<j;k++)
if(ans==d[i][k]+d[k+1][j])
{
print(i,k);print(k+1,j);
return;
}
}