#include<bits/stdc++.h> using namespace std; long long dp[4009][4009]; long long DP[4009][4009]; int TAB[100009]; char tab[100009]; void dod(int y1, int y2, int x1, int x2) { dp[y1][x1]++; dp[y2+1][x1]--; dp[y1][x2+1]--; dp[y2+1][x2+1]+=2; } int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>tab[i]; if(tab[i]=='('){TAB[i]=1;} else if(tab[i]==')'){TAB[i]=-1;} } for(int i=1;i<=n;i++) { int suma=0; for(int j=i;j<=n;j++) { suma+=TAB[j]; if(suma==0) { dod(1,i,j,n); } else if(suma<0){break;} } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dp[i][j]+=dp[i][j-1]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dp[i][j]+=dp[i-1][j]; } } for(int i=1;i<=n;i++) { DP[i][1]=dp[1][i]; } for(int k=2;k<=m;k++) { for(int i=1;i<=n;i++) { DP[i][k]=2000000000000000009; for(int j=0;j<i;j++) { DP[i][k]=min(DP[i][k],DP[j][k-1]+dp[j+1][i]); } } } cout<<DP[n][m]<<endl; 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 60 61 62 63 64 65 66 67 68 | #include<bits/stdc++.h> using namespace std; long long dp[4009][4009]; long long DP[4009][4009]; int TAB[100009]; char tab[100009]; void dod(int y1, int y2, int x1, int x2) { dp[y1][x1]++; dp[y2+1][x1]--; dp[y1][x2+1]--; dp[y2+1][x2+1]+=2; } int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>tab[i]; if(tab[i]=='('){TAB[i]=1;} else if(tab[i]==')'){TAB[i]=-1;} } for(int i=1;i<=n;i++) { int suma=0; for(int j=i;j<=n;j++) { suma+=TAB[j]; if(suma==0) { dod(1,i,j,n); } else if(suma<0){break;} } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dp[i][j]+=dp[i][j-1]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dp[i][j]+=dp[i-1][j]; } } for(int i=1;i<=n;i++) { DP[i][1]=dp[1][i]; } for(int k=2;k<=m;k++) { for(int i=1;i<=n;i++) { DP[i][k]=2000000000000000009; for(int j=0;j<i;j++) { DP[i][k]=min(DP[i][k],DP[j][k-1]+dp[j+1][i]); } } } cout<<DP[n][m]<<endl; return 0; } |