http://poj.org/problem?id=1141
dp求最优解。
#define N 110
char str[N];
int dp[N][N];//i到j之间插入的最小字符数
int tag[N][N];//记录需要插入字符的位置
void gao(int n){
int i,j,k;
for(i=0;i<=n;i++){
for(j=0;j<=n;j++){
dp[i][j] = 0;
}
dp[i][i] = 1;
}
for(k=1;k<n;k++){
for(i=1;i+k<=n;i++){
j = i+k;
if((str[i] == '(' && str[j] == ')') || (str[i] == '[' && str[j] == ']')){
dp[i][j] = dp[i+1][j-1];
tag[i][j] = -1;
} else dp[i][j] = MAX;
for(int m=i;m<j;m++){
if(dp[i][j] > dp[i][m]+dp[m+1][j]){
dp[i][j] = dp[i][m]+dp[m+1][j];
tag[i][j] = m;
}
}
}
}
}
void out(int i,int j){//递归输出
if(i>j)return ;
if(i == j){
if(str[i] == '(' || str[i] == ')')printf("()");
if(str[i] == '[' || str[i] == ']')printf("[]");
//return ;
} else
if(tag[i][j] == -1){
printf("%c",str[i]);
out(i+1,j-1);
printf("%c",str[j]);
} else {
out(i,tag[i][j]);
out(tag[i][j]+1,j);
}
}
int main(){
while(gets(str+1)!=NULL){
int len = strlen(str+1);
gao(len);
out(1,len);
puts("");
}
return 0;
}