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;
}