括号匹配
作者:
恒_41
,
2024-04-10 15:06:25
,
所有人可见
,
阅读 3
#include <cstring>
#include <algorithm>
#include<iostream>
using namespace std;
const int N = 110;
const int INF = 1e9;
int f[N][N];//含义:将下标从i到j的所有括号变成对称串的最小操作数
int n;
bool match(char a, char b) {
if (a == '[' && b == ']') return true;
if (a == '(' && b == ')') return true;
return false;
}
int main() {
string s;
cin >> s;
int n = s.size();
for (int len = 1; len <= n; len++) {//枚举区间长度
for (int i = 0; i + len - 1 < n; i++) {//枚举起点
int j = i + len - 1;//计算右端点
f[i][j] = INF;//求dp的最小值相关问题时必须将dp数组初始化为INF
if (match(s[i], s[j])) //左边大类(把ij区间变成形如(A)/[A]的方案)的第一种情况
f[i][j] = f[i + 1][j - 1];//端点匹配,只需要对[i+1,j-1]区间回文化操作
f[i][j] = min(f[i + 1][j] + 1, f[i][j]);//最后一次操作前,i不在回文串中,先把[i + 1,j]匹配上再添上与i匹配的字符
f[i][j] = min(f[i][j - 1] + 1, f[i][j]);
for (int k = i; k < j; k++)//右边大类(最后把两个回文串合并)枚举左串得右端点
f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
}
}
cout << f[0][n - 1] << endl;
}