#include <bits/stdc++.h> using namespace std; //#define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size #define RS resize template<class T> using P = pair<T, T>; template<class T> using V = vector<T>; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int inf = 1e9; int n, k; cin >> n >> k; V<int> a(n); REP(i, n) { char c; cin >> c; a[i] = c == '(' ? 1 : -1; } V<V<bool>> b(n, V<bool>(n)); REP(i, n) { int sum = 0; FOR(j, i, n) { sum += a[j]; if (sum < 0) break; if (sum == 0) b[i][j] = true; } } V<V<int>> w(n, V<int>(n)); REP(i, n - 1) { w[i][i + 1] = b[i][i + 1]; } FOR(d, 2, n) { REP(l, n - d) { int r = l + d; w[l][r] = b[l][r] + w[l][r - 1] + w[l + 1][r] - w[l + 1][r - 1]; } } V<V<int>> dp(n, V<int>(k, inf)); REP(i, n) { dp[i][0] = w[0][i]; if (i == 0) continue; FOR(j, 1, k) { int m = dp[i - 1][j - 1]; REP(l, i - 1) { m = min(m, dp[l][j - 1] + w[l + 1][i]); } dp[i][j] = m; } } cout << dp[n - 1][k - 1] << '\n'; } // g++ -std=c++17 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG -O3 naw.cpp -o a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <bits/stdc++.h> using namespace std; //#define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size #define RS resize template<class T> using P = pair<T, T>; template<class T> using V = vector<T>; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int inf = 1e9; int n, k; cin >> n >> k; V<int> a(n); REP(i, n) { char c; cin >> c; a[i] = c == '(' ? 1 : -1; } V<V<bool>> b(n, V<bool>(n)); REP(i, n) { int sum = 0; FOR(j, i, n) { sum += a[j]; if (sum < 0) break; if (sum == 0) b[i][j] = true; } } V<V<int>> w(n, V<int>(n)); REP(i, n - 1) { w[i][i + 1] = b[i][i + 1]; } FOR(d, 2, n) { REP(l, n - d) { int r = l + d; w[l][r] = b[l][r] + w[l][r - 1] + w[l + 1][r] - w[l + 1][r - 1]; } } V<V<int>> dp(n, V<int>(k, inf)); REP(i, n) { dp[i][0] = w[0][i]; if (i == 0) continue; FOR(j, 1, k) { int m = dp[i - 1][j - 1]; REP(l, i - 1) { m = min(m, dp[l][j - 1] + w[l + 1][i]); } dp[i][j] = m; } } cout << dp[n - 1][k - 1] << '\n'; } // g++ -std=c++17 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG -O3 naw.cpp -o a |