括号匹配问题

来源:互联网 发布:如何开通淘宝 编辑:程序博客网 时间:2024/06/07 05:07

给你一些括号,类似于
((]))
[[]]
((([[)]])))
这种不是完全匹配的括号,问至少加多少个括号,能使它变成完全匹配的
dp思想,用的是递归的方法

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=110;char tab[maxn];int f[maxn][maxn];//f[i][j]是从i 到 j 凑成匹配括号的最小的加括号数int fun(int i,int j){    if(i>j)return 0;    if(f[i][j]>=0)return f[i][j];    if(i==j)return f[i][j]=1;    int va=maxn;    if((tab[i]=='('&&tab[j]==')') || (tab[i]=='['&&tab[j]==']'))        va=fun(i+1,j-1);    for(int mid=i;mid<j;mid++){        va=min(va,fun(i,mid)+fun(mid+1,j));    }    return f[i][j]=va;}int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++){        memset(f,-1,sizeof(f));        memset(tab,0,sizeof(tab));        scanf("%s",tab);        cout<<fun(0,strlen(tab)-1)<<endl;    }}