티스토리 뷰
728x90
문제 링크
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 |