아래와 같이 정의하자.
Ci: i번째 문자 (A|B)
f(i,A): Ci까지 봤을 때, 모두 A로 만드는 최소 비용
f(i,B): Ci까지 봤을 때, 모두 B로 만드는 최소 비용
Ci=A라면,
- f(i,A)=min(f(i−1,A),f(i−1,B)+1)
- AA…AA+A라면 그대로 유지
- BB…BB+A라면 BB…BB를 모두 A로 변경
- f(i,B)=min(f(i−1,A),f(i−1,B))+1
- AA…AA+A라면 전체를 B로 변경
- BB…BB+A라면 A를 B로 변경
Ci=B라면,
- f(i,A)=min(f(i−1,A),f(i−1,B))+1
- AA…AA+B라면 B를 A로 변경
- BB…BB+B라면 전체를 A로 변경
- f(i,B)=min(f(i−1,A)+1,f(i−1,B))
- AA…AA+B라면 AA…AA를 모두 B로 변경
- BB…BB+B라면 그대로 유지
이와 같이 진행할 수 있다. 답은 min(f(N,A),f(N,B)+1)이 된다.
int N, dp[MAXN][2];
char dna[MAXN];
int main(void) {
fastio;
cin >> N >> dna;
if (dna[0] == 'A') {
dp[0][0] = 0;
dp[0][1] = 1;
}
else {
dp[0][0] = 1;
dp[0][1] = 0;
}
for (int i = 1; i < N; i++) {
if (dna[i] == 'A') {
dp[i][0] = min(dp[i - 1][0], dp[i - 1][1] + 1);
dp[i][1] = min(dp[i - 1][0], dp[i - 1][1]) + 1;
}
else {
dp[i][0] = min(dp[i - 1][0], dp[i - 1][1]) + 1;
dp[i][1] = min(dp[i - 1][0] + 1, dp[i - 1][1]);
}
}
cout << min(dp[N - 1][0], dp[N - 1][1] + 1);
return 0;
}
'알고리즘' 카테고리의 다른 글
[BOJ 4900] 7 더하기 (0) | 2024.03.26 |
---|---|
[BOJ 17215] 볼링 점수 계산 (0) | 2024.03.26 |
[BOJ 27966] △ (0) | 2024.03.25 |
[BOJ 26008] 해시 해킹 (1) | 2024.03.24 |
[BOJ 11899] 괄호 끼워넣기 (1) | 2024.03.22 |