#include <bits/stdc++.h> using namespace std; const int MAXN = 110; int dp[MAXN][MAXN]; int main() { string s; cin >> s; int n = s.size(); //对不括号不匹配的区间就标记为1操作 for (int i = 0; i < n-1; i++) { if ((s[i] == '(' && s[i+1] == ')') || (s[i] == '[' && s[i+1] == ']')) { dp[i][i+1] = 0; } else { dp[i][i+1] = 1; } } //记得要从单个长度查起,因为后面的状态会依赖前面的状态 for (int len = 0; len < n; len++) { for (int i = 0; i < n - len; i++) { int j = i + len; //先枚举分割点,然后枚举左右括号的匹配情况 dp[i][j] = min(dp[i+1][j] + 1, dp[i][j-1] + 1); //特判相同情况 if ((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']')) { dp[i][j] = min(dp[i][j], dp[i+1][j-1]); } //枚举分割点 for (int k = i; k < j; k++) { dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j]); } } } cout << dp[0][n-1] << endl; return 0; }