类似最长公共子串的一道动态规划题目。
题意
给定两个基因字符串,用A,C,G,T表示其组成成分。若两个基因的长度不一样,可以通过在两个串中分别添加空格使其长度一致。当其长度一样后,分别计算对应位置上的两个字母的分数,并将所有的分数相加便得到两个串的相似度分数。求,两个基因串的最高分数。
分析
给定两个基因串Gn, Gm,要求其最高分数f(n, m),有以下两种情况:
1)G[n] = G[m],则f(n, m) = f(n-1, m-1) + 5;
2)G[n] != G[m], 则可分三种情况:
i.在Gn后添加空格,其分数为f(n, m) = f(n, m-1) + scores[4][Index(G[m])];
ii. 在Gm后添加空格,其分数为f(n, m) = f(n-1, m) + scores[Index(G[n])][4];
iii. 直接使用Gn, Gm的最后两个字配对,其分数为f(n, m) = f(n-1, m-1) + scores[Index(G[n])][Index(G[m])];
其中,Index()返回字母在分数矩阵中的所在行或列。(详见原题分数矩阵)
再取i, ii, iii这三种情况的最大值即为Gn, Gm的最高分数。
代码