括号配对【区间DP】【回文子串】

    科技2025-07-11  18

    括号配对

    题意

    递归定义一组字符匹配模式

    增加几个字符满足这个匹配。

    思路

    添加多少个字符,可以转化为n-“回文子串”,这里的回文子串需要重新定义

    AAAABBBB:A符合定义,B也符合定义的话:最长子串,我们枚举中间端点取最大值。

    ABBA:这种情况,我们判断【l, r】 match(l,r)是不是匹配,匹配的话f(l+1,r-1)+2

    代码

    #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; typedef unsigned long long ull; #define mst(s,_s) memset(s, _s, sizeof(s)) const double PI = acos(-1.0); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int N = 1e3+100; int T,n,m; char str[N]; int f[N][N]; bool match(char a,char b) { if(a=='(' && b==')') return true; if(a=='[' && b==']') return true; else return false; } int main() { cin>>str+1; n=strlen(str+1); for(int len=2;len<=n;len++) { for(int l=1;l+len-1<=n;l++) { int r=l+len-1; if(len==1) f[l][r]=0; if(match(str[l],str[r])) f[l][r]=max(f[l][r],f[l+1][r-1] + 2); for(int k=l;k<r;k++) { f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]); } } } cout<<n - f[1][n]<<endl; return 0; }
    Processed: 0.037, SQL: 8