#include <bits/stdc++.h>
using namespace std;
int dp[2][505][1005];
int n,m;
string s;
int cost[1005][505][505];
int ones[505];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
for(int i=0; i<2; i++) for(int j=0; j<505; j++) for(int k=0; k<1005; k++) dp[i][j][k]=1e8;
cin >> n >> m;
cin >> s;
int cnt=1;
for(int i=1; i<=2*n; i++){
if(s[i-1]=='B'){
ones[cnt]=i;
cnt++;
}
}
for(int i=1; i<=2*n; i++){
for(int j=1; j<=n; j++){
int cur=0;
for(int k=j; k<=n; k++){
cur+=(ones[k]>=i+k-j?0:i+k-j-ones[k]);
cost[i][j][k]=cur;
}
}
}
vector<int> ansers;
dp[0][0][0]=0;
for(int i=0; i<=n; i++){
for(int j=0; j<=n; j++){
for(int k=0; k<=n*2; k++){
dp[!(i&1)][j][k]=1e8;
}
}
for(int j=0; j<=n; j++){
for(int k=ones[j]; k<=n*2; k++){
if(k+1<=2*n&&i) dp[i&1][j][k+1]=min(dp[i&1][j][k+1],dp[i&1][j][k]+1);
if(i<n&&k-j+1<=n&&k+k-2*j+1<=2*n&&k-j+1>j) dp[!(i&1)][k-j+1][max(ones[k-j+1],k+k-2*j+1)]=min(dp[!(i&1)][k-j+1][max(ones[k-j+1],k+k-2*j+1)],dp[i&1][j][k]+cost[k+1][j+1][k-j+1]);
}
}
if(i){
int ans=dp[i&1][n][2*n];
//cout << ans << '\n';
for(int j=n+1; j<2*n; j++){
//cout << dp[m][i-n][i] << ' ' << cost[i+1][i-n+1][n] << '\n';
ans=min(ans,dp[i&1][j-n][j]+cost[j+1][j-n+1][n]);
}
if(ans<1e8) ansers.push_back(ans);
}
}
//for(int i:ansers) cout << i << ' ';
//cout << ans << '\n';
for(int i=1; i<(int)ansers.size()-1; i++){
assert(ansers[i-1]-ansers[i]>=ansers[i]-ansers[i+1]);
}
cout << ansers[m-1];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |