/*
Zadanie: Nawiasowe podziały
Autor: Tomasz Kwiatkowski
*/
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
using namespace std;
typedef long long ll;
const int MAXN = 4e3 + 7;
const int INF = 1e9 + 7;
ll cnt[MAXN][MAXN];
ll dp[MAXN][MAXN];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N, K;
cin >> N >> K;
string s;
cin >> s;
for (int i = 1; i <= N; ++i) {
int d = 0;
for (int j = i; j <= N; ++j) {
d += (s[j - 1] == '(' ? 1 : -1);
if (d < 0) break;
if (d == 0) {
++cnt[1][j];
--cnt[i + 1][j];
}
}
}
for (int j = 1; j <= N; ++j) {
for (int i = 1; i <= N; ++i)
cnt[i][j] += cnt[i - 1][j];
}
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= N; ++j)
cnt[i][j] += cnt[i][j - 1];
}
for (int i = 1; i <= N; ++i) {
dp[i][0] = cnt[1][i];
for (int k = 1; k < K; ++k) {
dp[i][k] = 1e18;
for (int j = 0; j < i; ++j)
dp[i][k] = min(dp[i][k], dp[j][k - 1] + cnt[j + 1][i]);
}
}
cout << dp[N][K - 1] << '\n';
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 | /* Zadanie: Nawiasowe podziały Autor: Tomasz Kwiatkowski */ #include <bits/stdc++.h> #define fi first #define se second #define pb push_back using namespace std; typedef long long ll; const int MAXN = 4e3 + 7; const int INF = 1e9 + 7; ll cnt[MAXN][MAXN]; ll dp[MAXN][MAXN]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int N, K; cin >> N >> K; string s; cin >> s; for (int i = 1; i <= N; ++i) { int d = 0; for (int j = i; j <= N; ++j) { d += (s[j - 1] == '(' ? 1 : -1); if (d < 0) break; if (d == 0) { ++cnt[1][j]; --cnt[i + 1][j]; } } } for (int j = 1; j <= N; ++j) { for (int i = 1; i <= N; ++i) cnt[i][j] += cnt[i - 1][j]; } for (int i = 1; i <= N; ++i) { for (int j = 1; j <= N; ++j) cnt[i][j] += cnt[i][j - 1]; } for (int i = 1; i <= N; ++i) { dp[i][0] = cnt[1][i]; for (int k = 1; k < K; ++k) { dp[i][k] = 1e18; for (int j = 0; j < i; ++j) dp[i][k] = min(dp[i][k], dp[j][k - 1] + cnt[j + 1][i]); } } cout << dp[N][K - 1] << '\n'; return 0; } |
English