原题链接:https://vjudge.net/problem/UVA-1626
分类:最优矩阵链乘
备注:递归形式
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
char s[maxn];
int t,n,d[maxn][maxn];
bool match(char a,char b){
return (a=='['&&b==']')||(a=='('&&b==')');
}
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;
}
}
int main(void){
// freopen("in.txt","r",stdin);
fgets(s,maxn,stdin);
sscanf(s,"%d",&t);
fgets(s,maxn,stdin);
while(t--){
fgets(s,maxn,stdin);
n=strlen(s)-1;
dp();
print(0,n-1);
printf("\n");
if(t)printf("\n");
fgets(s,maxn,stdin);
}
return 0;
}