#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<vector<ll>> contr;
vector<vector<vector<ll>>> memo;
ll n, k;
const ll INF = 1e15;
ll dp(int l, int r, int k)
{
if (r == n)
{
if (l != r) return contr[l][r-1];
return 0ll;
}
else if (k < 0) return INF;
if (memo[l][r][k] != -1)
{
return memo[l][r][k];
}
ll res = min(contr[l][r] + dp(r+1,r+1,k-1), dp(l, r+1, k));
return memo[l][r][k] = res;
}
int main()
{
cin >> n >> k;
string in;
cin >> in;
contr.resize(n);
memo.resize(n);
for (int i = 0; i < n; i++)
{
memo[i].resize(n);
for (int j = 0; j < n; j++)
{
memo[i][j].assign(k, -1);
}
}
for (int i = 0; i < n; i++)
{
contr[i].resize(n);
contr[i][i] = 0;
for (int j = i + 1; j < n; j++)
{
ll depth = 0;
for (int k = j; k >= i; k--)
{
if (in[k] == ')') depth++;
else depth--;
if (depth < 0) break;
else if (depth == 0) contr[i][j]++;
}
contr[i][j] += contr[i][j-1];
}
}
cout << dp(0, 0, k-1) << '\n';
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; vector<vector<ll>> contr; vector<vector<vector<ll>>> memo; ll n, k; const ll INF = 1e15; ll dp(int l, int r, int k) { if (r == n) { if (l != r) return contr[l][r-1]; return 0ll; } else if (k < 0) return INF; if (memo[l][r][k] != -1) { return memo[l][r][k]; } ll res = min(contr[l][r] + dp(r+1,r+1,k-1), dp(l, r+1, k)); return memo[l][r][k] = res; } int main() { cin >> n >> k; string in; cin >> in; contr.resize(n); memo.resize(n); for (int i = 0; i < n; i++) { memo[i].resize(n); for (int j = 0; j < n; j++) { memo[i][j].assign(k, -1); } } for (int i = 0; i < n; i++) { contr[i].resize(n); contr[i][i] = 0; for (int j = i + 1; j < n; j++) { ll depth = 0; for (int k = j; k >= i; k--) { if (in[k] == ')') depth++; else depth--; if (depth < 0) break; else if (depth == 0) contr[i][j]++; } contr[i][j] += contr[i][j-1]; } } cout << dp(0, 0, k-1) << '\n'; } |
English