Processing math: 100%

알고리즘

[BOJ 2806] DNA 발견

dldyou 2024. 3. 25. 22:15

아래와 같이 정의하자.

Ci: i번째 문자 (A|B)

f(i,A): Ci까지 봤을 때, 모두 A로 만드는 최소 비용

f(i,B): Ci까지 봤을 때, 모두 B로 만드는 최소 비용

 

Ci=A라면,

  • f(i,A)=min(f(i1,A),f(i1,B)+1)
    • AAAA+A라면 그대로 유지
    • BBBB+A라면 BBBB를 모두 A로 변경
  • f(i,B)=min(f(i1,A),f(i1,B))+1
    • AAAA+A라면 전체를 B로 변경
    • BBBB+A라면 AB로 변경

Ci=B라면, 

  • f(i,A)=min(f(i1,A),f(i1,B))+1
    • AAAA+B라면 BA로 변경
    • BBBB+B라면 전체를 A로 변경
  • f(i,B)=min(f(i1,A)+1,f(i1,B))
    • AAAA+B라면 AAAA를 모두 B로 변경
    • BBBB+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