이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;
int N, K;
ll dp[5005][5005], in[1000006], suf[1000006], tot;
char c[2000006];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> N >> K;
for (int i = 1; i <= 2 * N; i++)
cin >> c[i];
for (int i = 1, j = 0, k = 1; i <= N; i++, k++)
{
while (c[k] != 'B')
j++, k++;
in[i - 1] = j;
}
for (int i = 0; i < N; i++)
in[i] = max((ll)i, in[i]);
for (int i = 1, j = N, k = 1; i <= N; i++, k++)
{
while (c[k] != 'A')
j--, k++;
suf[i] = j;
}
for (int i = N; i >= 0; i--)
suf[i] += suf[i + 1];
for (int k = 0; k <= K; k++)
for (int i = 0; i <= N; i++)
dp[i][k] = 1e18;
dp[0][0] = 0;
for (int k = 1; k <= K; k++)
for (int i = 1; i <= N; i++)
{
for (int j = 0; j < i; j++)
if (in[j] < i)
dp[i][k] = min(dp[i][k], dp[j][k - 1] + (i - in[j]) * (N - j) - (suf[in[j] + 1] - suf[i + 1]));
else
dp[i][k] = min(dp[i][k], dp[j][k - 1] + 0);
// cout << dp[i][k] << " \n"[i == N];
}
cout << dp[N][K] << '\n';
}
# | 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... |