定义f[i][j]表示要使i到j这一段合法最少需要多少加入多少个括号,不难写出转移
1.l==r 至少添加一个所以f[i][j]=1
2.l==r-1&&s[l]==s[r]不用加
3.s[l]==s[r] min(x,dfs(l+1,r-1))两边不加、
4.min( dfs(l,i)+dfs(i+1,r))很好理解把
至于输出的话 ,怎么转移就怎么输出吧
!!!!!!!!!结尾必须输出一个‘’\n‘’也是坑的要死
#include<cstdio> #include<cstring> #include<iostream> #define maxn 102 #define inf 0x3f3f3f3f using namespace std; int f[maxn][maxn],n; char s[maxn*3]; bool check(int x,int y){ if(s[x]=='('&&s[y]==')')return true; if(s[x]=='['&&s[y]==']')return true; return false; } int dfs(int l,int r){ int& x=f[l][r]; if(l>r||(r-l==1&&check(l,r)))return x=0; if(l==r)return x=1; if(x!=inf)return x; if(check(l,r))x=min(x,dfs(l+1,r-1)); for(int i=l;i<r;i++)x=min(x,dfs(l,i)+dfs(i+1,r)); return x; } void print(int l,int r){ if(r-l==1&&check(l,r)){ if(s[l]=='(')printf("()"); else printf("[]");return; } if(l==r&&f[l][r]==1){ if(s[l]=='('||s[l]==')')printf("()"); else printf("[]");return; } if(check(l,r)&&f[l][r]==f[l+1][r-1]){ if(s[l]=='(')printf("(");else printf("["); print(l+1,r-1); if(s[r]==')')printf(")");else printf("]");return; } for(int i=l;i<=r;i++)if(f[l][r]==f[l][i]+f[i+1][r]){ print(l,i);print(i+1,r);return; } } int main(){ scanf("%s",s+1);n=strlen(s+1); memset(f,inf,sizeof(f)); dfs(1,n); print(1,n); printf("\n"); return 0; }