#include <bits/stdc++.h> using namespace std; #define iamspeed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define st first #define nd second int n, k, iledob[4004][4004], czybal[4004][4004], res[4004][4004]; string s; stack<char> stk; int main(){ iamspeed; cin >> n >> k >> s; for(int i = 0 ; i < n ; i++){ while(!stk.empty()) stk.pop(); for(int j = i ; j < n ; j++){ if(j == i && s[j] != ')') stk.push(s[j]); else if(s[j] == '(') stk.push(s[j]); else if(s[j] == ')'){ if(stk.empty()) break; else stk.pop(); } if(stk.empty()) czybal[i][j] = 1; } } for(int i = 2 ; i <= n ; i++){ for(int j = i - 1 ; j < n ; j++){ if(i == 2) iledob[j - 1][j] = (s[j - 1] == '(' && s[j] == ')'); else{ iledob[j - i + 1][j] = iledob[j - i + 1][j - 1] + iledob[j - i + 2][j] - iledob[j - i + 2][j - 1] + czybal[j - i + 1][j]; } } } for(int i = 1 ; i <= k ; i++){ for(int j = i - 1 ; j < n ; j++){ res[i][j] = iledob[0][j]; for(int l = i - 2 ; l < j && i != 1; l++){ res[i][j] = min(res[i][j], res[i - 1][l] + iledob[l + 1][j]); } } } cout << res[k][n - 1] << endl; }
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 | #include <bits/stdc++.h> using namespace std; #define iamspeed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define st first #define nd second int n, k, iledob[4004][4004], czybal[4004][4004], res[4004][4004]; string s; stack<char> stk; int main(){ iamspeed; cin >> n >> k >> s; for(int i = 0 ; i < n ; i++){ while(!stk.empty()) stk.pop(); for(int j = i ; j < n ; j++){ if(j == i && s[j] != ')') stk.push(s[j]); else if(s[j] == '(') stk.push(s[j]); else if(s[j] == ')'){ if(stk.empty()) break; else stk.pop(); } if(stk.empty()) czybal[i][j] = 1; } } for(int i = 2 ; i <= n ; i++){ for(int j = i - 1 ; j < n ; j++){ if(i == 2) iledob[j - 1][j] = (s[j - 1] == '(' && s[j] == ')'); else{ iledob[j - i + 1][j] = iledob[j - i + 1][j - 1] + iledob[j - i + 2][j] - iledob[j - i + 2][j - 1] + czybal[j - i + 1][j]; } } } for(int i = 1 ; i <= k ; i++){ for(int j = i - 1 ; j < n ; j++){ res[i][j] = iledob[0][j]; for(int l = i - 2 ; l < j && i != 1; l++){ res[i][j] = min(res[i][j], res[i - 1][l] + iledob[l + 1][j]); } } } cout << res[k][n - 1] << endl; } |