括号配对
题意
递归定义一组字符匹配模式
增加几个字符满足这个匹配。
思路
添加多少个字符,可以转化为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;
}