티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/2306

 

2306번: 유전자

DNA 서열은 4개의 문자 {a,c,g,t} 로 이루어진 문자열이다. DNA 서열에는 생명의 신비를 풀 수 있는 많은 정보가 들어 있다. 특히 KOI 유전자의 길이는 사람의 키와 깊은 상관 관계가 있다는 것이 알려

www.acmicpc.net

 

풀이

DP 문제입니다. 상태를 다음과 같이 정의합시다.

$D[i][j]$: 부분 문자열 $s[i, j]$의 최대 KOI 유전자 길이

 

1) 우선 간단하게 $i$이상 $j$미만의 모든 $k$에 대해,

$$D[i][j] = \max_{k=i}^{j-1}(D[i][k] + D[k+1][j])$$

이런 방식으로 i ~ j를 가능한 모든 두 구간으로 나누어보면 최댓값을 구할 수 있습니다.

 

2) 만약 $s[i] == s[j]$인 경우

$$D[i][j] = max(D[i][j], 2 + D[i+1][j-1])$$

까지 고려해주면 됩니다.

 

 

정답 코드

#include <bits/stdc++.h>

using namespace std;

string s;
int n;
char to['z'];
int d[555][555];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    to['a'] = 't';
    to['g'] = 'c';
    cin >> s;
    n = s.size();
    for (int l = 1; l < n; l++) {
        for (int i = 0; i + l< n; i++) {
            int j = i + l;
            if ((s[i] == 'a' || s[i] == 'g') && s[j] == to[s[i]]) {
                d[i][j] = d[i + 1][j - 1] + 2;
            }
            for (int k = i; k < j; k++) {
                d[i][j] = max(d[i][j], d[i][k] + d[k + 1][j]);
            }
        }
    }
    cout << d[0][n - 1];
}
728x90

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[BOJ] 백준 2169 - 로봇 조종하기  (0) 2021.03.30
[BOJ] 백준 2281 - 데스노트  (1) 2021.03.30
[BOJ] 백준 12886 - 돌 그룹  (0) 2021.03.30
[BOJ] 백준 10800 - 컬러볼  (0) 2021.03.30
[BOJ] 백준 1424 - 새 앨범  (0) 2021.03.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함