#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int ui; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<long long> vll; const ll LINF = 1e18; const int INF = 1e9; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; string word; cin >> word; int cnt_dyck_words[n][n]; memset(cnt_dyck_words, 0, sizeof(cnt_dyck_words)); for (int i = 0; i < n; ++i) { int open_parenthesis = 0; for (int j = i; j < n; ++j) { if (word[j] == '(') { ++open_parenthesis; } else { --open_parenthesis; } if (open_parenthesis < 0) { break; } cnt_dyck_words[i][j] = open_parenthesis == 0; } } for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { cnt_dyck_words[i][j] += cnt_dyck_words[i][j - 1]; } } for (int i = n - 2; i >= 0; --i) { for (int j = i + 1; j < n; ++j) { cnt_dyck_words[i][j] += cnt_dyck_words[i + 1][j]; } } // for (int i = 0; i < n; ++i) { // for (int j = 0; j < n; ++j) { // cerr << cnt_dyck_words[i][j] << ' '; // } // cerr << '\n'; // } int subarray_sum[n][k]; memset(subarray_sum, 0, sizeof(subarray_sum)); for (int i = 0; i < n; ++i) { subarray_sum[i][0] = cnt_dyck_words[0][i]; for (int j = 1; j < k; ++j) { int mn = INF; for (int split = 0; split < i; ++split) { mn = min(mn, subarray_sum[split][j - 1] + cnt_dyck_words[split + 1][i]); } subarray_sum[i][j] = mn; } } cout << subarray_sum[n - 1][k - 1] << endl; return 0; }
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 73 74 75 76 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int ui; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<long long> vll; const ll LINF = 1e18; const int INF = 1e9; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; string word; cin >> word; int cnt_dyck_words[n][n]; memset(cnt_dyck_words, 0, sizeof(cnt_dyck_words)); for (int i = 0; i < n; ++i) { int open_parenthesis = 0; for (int j = i; j < n; ++j) { if (word[j] == '(') { ++open_parenthesis; } else { --open_parenthesis; } if (open_parenthesis < 0) { break; } cnt_dyck_words[i][j] = open_parenthesis == 0; } } for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { cnt_dyck_words[i][j] += cnt_dyck_words[i][j - 1]; } } for (int i = n - 2; i >= 0; --i) { for (int j = i + 1; j < n; ++j) { cnt_dyck_words[i][j] += cnt_dyck_words[i + 1][j]; } } // for (int i = 0; i < n; ++i) { // for (int j = 0; j < n; ++j) { // cerr << cnt_dyck_words[i][j] << ' '; // } // cerr << '\n'; // } int subarray_sum[n][k]; memset(subarray_sum, 0, sizeof(subarray_sum)); for (int i = 0; i < n; ++i) { subarray_sum[i][0] = cnt_dyck_words[0][i]; for (int j = 1; j < k; ++j) { int mn = INF; for (int split = 0; split < i; ++split) { mn = min(mn, subarray_sum[split][j - 1] + cnt_dyck_words[split + 1][i]); } subarray_sum[i][j] = mn; } } cout << subarray_sum[n - 1][k - 1] << endl; return 0; } |