티스토리 뷰

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

이런 방식으로 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
«   2025/04   »
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
글 보관함