相似基因
相似基因
题目背景
大家都知道,基因可以看作一个碱基对序列。它包含了 $4$ 种核苷酸,简记作 A, C, G, T
。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。
在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。
题目描述
两个基因的相似度的计算方法如下:
对于两个已知基因,例如 AGTGATG
和 GTTAG
,将它们的碱基互相对应。当然,中间可以加入一些空碱基 -
,例如:
$$
\def\arraystretch{1.5}
\begin{array}{|c|c|c|c|c|c|c|c|} \hline
\tt A & \tt G & \tt T & \tt G & \tt A & \tt T & \texttt - & \tt G \ \hline
\texttt - & \tt G & \tt T & \texttt - & \texttt - & \tt T & \texttt A & \tt G \ \hline
\end{array}
$$
这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示:
$$
\def\arraystretch{1.5}
\begin{array}{ |c|c|c|c|c|c|} \hline
& \tt A & \tt C & \tt G & \tt T & \texttt - \ \hline
\tt A & 5 & -1 & -2 & -1 & -3\ \hline
\tt C & -1 & 5 & -3 & -2 & -4 \\hline
\tt G & -2 & -3 & 5 & -2 & -2 \\hline
\tt T & -1 & -2 & -2 & 5 & -1 \\hline
\texttt - & -3 & -4 & -2 & -1 & * \\hline
\end{array}
$$
那么相似度就是:$(-3)+5+5+(-2)+(-3)+5+(-3)+5=9$。因为两个基因的对应方法不唯一,例如又有:
$$
\def\arraystretch{1.5}
\begin{array}{|c|c|c|c|c|c|c|} \hline
\tt A & \tt G & \tt T & \tt G & \tt A & \tt T & \tt G \ \hline
\texttt - & \tt G & \tt T & \texttt T & \texttt A & \texttt - & \tt G \ \hline
\end{array}
$$
相似度为:$(-3)+5+5+(-2)+5+(-1)+5=14$。规定两个基因的相似度为所有对应方法中,相似度最大的那个。
输入格式
共两行。每行首先是一个整数 $n$,表示基因序列的长度;隔一个空格后是一个基因序列,序列中只含 $\verb!A!,\verb!C!,\verb!G!,\verb!T!$ 四种字母。$1 \le n\le 100$。
输出格式
仅一行,即输入基因的相似度。
样例 #1
样例输入 #1
1 | 7 AGTGATG |
样例输出 #1
1 | 14 |
解题思路
这个题目没想出来区间dp怎么解决,使用线性dp解决的。我们思路如下图,但是需要注意,我们初始化会存在dp[0] [j]和dp[i] [0]的情况,这个初始化其实就是-和剩下的相对应,我们可以处理一个a基因和b基因的对于-匹配的前缀和数组,方便计算。还有当我们k和j匹配了,还会剩下k+1 到i的基因要和-匹配,这个部分也可以通过前缀和数组计算出来。