题目大意:求出互相匹配的括号的总数
解题思路:找出最少需要多少个括号来匹配,然后再拿总长度减去最少需要匹配的括号数
转移方式有两种:第一种:形如S形如[S1]或者(S1)则d(s)=min(d(s),d(s1))
第二种:S至少有两个字符的时候可以分成AB两个子串,则d(s)=d(A)+d(B);
但需要注意的是,不管是否满足第一条,都要尝试第二条,否则[ ] [ ]会转移到 ] [ 只能加两个括号了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int maxn=100+10;
const int INF=(1<<10);
string s;
int d[maxn][maxn];
bool match(char a,char b)
{
if((a=='('&&b==')')||(a=='['&&b==']')) return true;
else return false;
}
int main()
{
while(cin>>s)
{
if(s=="end") break;
int n=s.length();
memset(d, -1, sizeof(d));
for(int i = 0; i < n; i++)
{
d[i+1][i] = 0;
d[i][i] = 1;
}
for(int i = n-2; i >= 0; i--)
for(int j = i+1; j < n; j++)
{
d[i][j] = n;
if(match(s[i], s[j])) d[i][j] = min(d[i][j], d[i+1][j-1]);
for(int k = i; k < j; k++)
d[i][j] = min(d[i][j], d[i][k] + d[k+1][j]);
}
printf("%d\n",s.length()-d[0][n-1]);
}
}