이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
typedef long long llong;
const int MAXN = 5000 + 10;
const int INF = 1e9;
int n, k;
int h[MAXN];
int next[MAXN];
int prev[MAXN];
llong prefix[MAXN];
llong dp[MAXN][MAXN];
bool bl[MAXN][MAXN];
char s[2 * MAXN];
llong cost(int l, int r)
{
if (next[l] > r)
{
return 0;
}
return (next[l] - l + 1) * (l - 1) + prefix[r] - prefix[next[l]] - (r - l + 1) * (l - 1);
}
int f(int pos, int cnt)
{
if (pos == n + 1)
{
if (cnt == k) return 0;
return INF;
}
if (bl[pos][cnt])
{
return dp[pos][cnt];
}
dp[pos][cnt] = INF;
bl[pos][cnt] = true;
for (int next = pos + 1 ; next <= n + 1 ; ++next)
{
dp[pos][cnt] = std::min(dp[pos][cnt], f(next, cnt + 1) + cost(pos, next - 1));
}
return dp[pos][cnt];
}
void solve()
{
int cntA = 0;
int cntB = 0;
for (int i = 1 ; i <= 2 * n ; ++i)
{
if (s[i] == 'B')
{
cntB++;
} else
{
cntA++;
h[cntA] = cntB;
}
}
for (int i = 1 ; i <= n ; ++i)
{
prefix[i] = prefix[i - 1] + h[i];
}
next[n + 1] = n + 1;
h[n + 1] = n + 1;
for (int i = n ; i >= 1 ; --i)
{
next[i] = next[i + 1];
while (next[i] >= i && h[next[i]] >= i)
{
next[i]--;
}
}
prev[0] = 0;
for (int i = 1 ; i <= n ; ++i)
{
prev[i] = prev[i - 1];
while (prev[i] <= i && h[prev[i]] < i)
{
prev[i]++;
}
}
std::cout << f(1, 0) << '\n';
}
void input()
{
std::cin >> n >> k;
std::cin >> s + 1;
}
void fastIOI()
{
std::ios_base :: sync_with_stdio(0);
std::cout.tie(nullptr);
std::cin.tie(nullptr);
}
int main()
{
fastIOI();
input();
solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
chorus.cpp: In function 'void input()':
chorus.cpp:101:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
101 | std::cin >> s + 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... |