#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 115;
int dp[maxn][maxn];
int path[maxn][maxn];
char s[maxn];
void dfs( int st,int t ){
if( st>t ) return ;
if( st==t ){
if( s[st]=='('||s[st]==')' ) printf("()");
else printf("[]");
return ;
}
if( path[st][t]== -1 ){
printf("%c",s[st]);
dfs( st+1,t-1 );
printf("%c",s[t]);
}
else {
dfs( st,path[st][t] );
dfs( path[st][t]+1,t );
}
return ;
}
int main(){
while(scanf("%s",s)!=-1){
int l = strlen(s);
memset(dp,0x3f,sizeof(dp));
//memset(path,-1,sizef)
for(int i=0;i<l;i++){
dp[i][i] = 1;
}
for(int i=l-1;i>=0;i--){
for(int j=i+1;j<l;j++){
//printf("%c %c\n",s[i],s[j]);
if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']')){
//printf("%d %d\n",i,j);
if((j-i)>1){
if(dp[i][j] > dp[i+1][j-1]){
path[i][j] = -1;
dp[i][j] = dp[i+1][j-1];
}
}
else {
dp[i][j] = 0;
path[i][j] = -1;
}
}
//printf("2\n");
for(int k=i;k<j;k++){
if(dp[i][k]+dp[k+1][j] < dp[i][j]){
path[i][j] = k;
dp[i][j] = dp[i][k] + dp[k+1][j];
}
}
}
}
//printf("%d\n",dp[0][l-1]);
dfs(0,l-1);
puts("");
}
return 0;
}
EOJ 1255
最新推荐文章于 2020-04-09 11:45:48 发布