쉽지않은 블로그
백준온라인 2306번 [유전자][C++] 본문
2306번: 유전자
DNA 서열은 4개의 문자 {a,c,g,t} 로 이루어진 문자열이다. DNA 서열에는 생명의 신비를 풀 수 있는 많은 정보가 들어 있다. 특히 KOI 유전자의 길이는 사람의 키와 깊은 상관 관계가 있다는 것이 알려
www.acmicpc.net
나의 풀이
최대 길이가 정의되는 경우는 1) KOI유전자 + KOI유전자 또는 2) KOI유전자 안에 KOI유전자 가 들어가 있는 구조이므로
최대길이를 구하려고 할 때는 작은 것부터 결과를 이끌어내는 다이내믹 프로그래밍으로 풀어야 된다고 생각했다.
입력으로 주어진 문자열을 S라고 할 경우
i <=j 인 인덱스에 대하여
위에서 정의한 두 가지만 판별해주면 된다
코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
int d[501][501]; | |
string s; | |
bool isKOI(char a,char b){ | |
if((a=='a'&&b=='t')||(a=='g'&&b=='c'))return true; | |
return false; | |
} | |
int main(){ | |
ios_base::sync_with_stdio(false); | |
cin.tie(nullptr); | |
cin>>s; | |
int n = s.length(); | |
for(int k=1;k<n;k++){ | |
for(int i=0;i+k<n;i++){ | |
if(isKOI(s[i],s[i+k])){ | |
d[i][i+k]=d[i+1][i+k-1]+2; | |
} | |
for(int j=i;j<i+k;j++){ | |
d[i][i+k] = max(d[i][i+k],d[i][j]+d[j+1][i+k]); | |
} | |
} | |
} | |
cout<<d[0][n-1]; | |
} |
'알고리즘문제풀이 > 백준온라인' 카테고리의 다른 글
백준온라인 5052번 [전화번호 목록][C++] (0) | 2021.03.19 |
---|---|
백준온라인 2618번 [경찰차][C++] (0) | 2021.03.17 |
백준온라인 1533번 [길의 개수] [C++] (0) | 2021.03.16 |
백준온라인 16287번 [Parcel] [C++] (0) | 2021.03.14 |
백준온라인 1006번 [습격자 초라기] [C++] (0) | 2021.03.13 |