28024 - White Light
길이 $N(1\leq N\leq2\times10^5)$의 R, G, B로 이루어진 문자열 $S$가 있습니다. 길이 $K(1\leq N\leq2\times 10^5)$ 이하의 부분 문자열을 삭제하는 작업을 최소한으로 수행하여 문자열을 RGB...RGB꼴로 만드는 것이 목표입니다.
$dp[i][c]$을 $i$번째 문자열까지 보았을 때, 마지막을 문자 $c$로 끝내는데 필요한 최소 비용이라고 정의합니다.
그리고 $c’$를 $c$ 직전에 사용되었던 문자라고 정의합니다. ($c$가 B라면 $c’$는 G)
그렇다면 다음과 같이 dp table을 채울 수 있습니다.
$$
\begin{equation}
dp[i][c] = \min
\begin{cases}
dp[i-1][c'] & \text{if}\ s[i] = c \\
\min\limits_{i-k-1\leq x< i-1} dp[x][c'] + 1 & \text {if}\ s[i] = c\\
\min\limits_{i-k\leq x\leq i-1} dp[x][c] + 1
\end{cases}
\end{equation}
$$
Base case로 $dp[0][2] = 0$, 나머지는 $\text{INF}$으로 미리 채워 둘 수 있습니다. (첫 R을 이전 B의 끝에서부터 시작한다고 생각하면 됩니다.)
위 dp table을 나이브하게 채우면 $O(N^2)$의 시간이 들지만, segment tree나 BIT같은 range minimum query point update를 지원하는 자료구조를 사용하면 $O(N\log N)$의 시간복잡도로 해결할 수 있습니다.
1 | |