#include <iostream> #include <cstring> using namespace std; string s; int dp[105][105]; // 判断两个括号能否匹配 bool match(char a, char b) { return (a == '(' && b == ')') || (a == '[' && b == ']'); } int main() { cin >> s; int n = s.size(); memset(dp, 0, sizeof(dp)); // 长度为1的子串需要插入1个括号 for (int i = 0; i < n; i++) dp[i][i] = 1; // 枚举区间长度len,从2开始逐渐增加 for (int len = 2; len <= n; len++) { for (int i = 0; i + len - 1 < n; i++) { int j = i + len - 1; dp[i][j] = 1e9; // 如果两端配对 if (match(s[i], s[j])) { 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; }