#include <algorithm>
#include <cstdio>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define INT(x) int x; scanf("%d", &x)
#define LINE(n,x) char x[n]; fgets(x, n, stdin)
typedef long long LL;
const LL INF = 1000000000000000000LL;
const int N = 4000;
int h[N + 1];
LL x[N + 1][N + 1];
int y[N + 1][N + 1];
LL r[N + 1][N + 1];
int main() {
INT(n);
INT(k);
scanf("\n");
LINE(N+10, a);
REP(i,n) h[i + 1] = h[i] + (a[i] == '(' ? 1 : -1);
REP(i,n+1) y[i][i] = h[i];
REP(i,n) FOR(j,i+1,n+1) y[i][j] = min(y[i][j - 1], h[j]);
FOR(d,2,n+1) REP(i,n-d+1) {
int j = i + d;
x[i][j] = x[i + 1][j] + x[i][j - 1] - x[i + 1][j - 1];
if (h[i] == y[i][j] && h[i] == h[j]) ++x[i][j];
}
FOR(i,1,n+1) r[i][0] = INF;
FOR(i,1,n+1) FOR(kk,1,min(n,k)+1) {
LL mi = INF;
FOR(j,kk-1,i) mi = min(mi, r[j][kk-1] + x[j][i]);
r[i][kk] = mi;
}
printf("%lld\n", r[n][k]);
}
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 | #include <algorithm> #include <cstdio> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define INT(x) int x; scanf("%d", &x) #define LINE(n,x) char x[n]; fgets(x, n, stdin) typedef long long LL; const LL INF = 1000000000000000000LL; const int N = 4000; int h[N + 1]; LL x[N + 1][N + 1]; int y[N + 1][N + 1]; LL r[N + 1][N + 1]; int main() { INT(n); INT(k); scanf("\n"); LINE(N+10, a); REP(i,n) h[i + 1] = h[i] + (a[i] == '(' ? 1 : -1); REP(i,n+1) y[i][i] = h[i]; REP(i,n) FOR(j,i+1,n+1) y[i][j] = min(y[i][j - 1], h[j]); FOR(d,2,n+1) REP(i,n-d+1) { int j = i + d; x[i][j] = x[i + 1][j] + x[i][j - 1] - x[i + 1][j - 1]; if (h[i] == y[i][j] && h[i] == h[j]) ++x[i][j]; } FOR(i,1,n+1) r[i][0] = INF; FOR(i,1,n+1) FOR(kk,1,min(n,k)+1) { LL mi = INF; FOR(j,kk-1,i) mi = min(mi, r[j][kk-1] + x[j][i]); r[i][kk] = mi; } printf("%lld\n", r[n][k]); } |
English