给一组小括号与中括号的序列,加入最少的字符,使该序列变为合法序列,输出该合法序列。
dp[a][b]记录a-b区间内的最小值,
mark[a][b]记录该区间的最小值怎样得到。
#include "stdio.h"#include "string.h"int inf=99999999;char str[110];int dp[110][110],mark[110][110];void pri(int l,int r){ if (l>r) return ; if (l==r) { if(str[l]=='(' || str[r]==')') printf("()"); if(str[l]=='[' || str[r]==']') printf("[]"); return ; } if (mark[l][r]==-1) { printf("%c",str[l]); pri(l+1,r-1); printf("%c",str[r]); } else { pri(l,mark[l][r]); pri(mark[l][r]+1,r); }}int main(){ int i,j,k,a,b,n; while (gets(str)) { n=strlen(str); if (n==0) { printf("\n"); continue; } for (i=0;i=j) dp[i][j]=0; else dp[i][j]=inf; for (i=0;i