洛谷1140相似基因

题目描述

两个基因的相似度的计算方法如下:

对于两个已知基因,例如AGTGATG和GTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如:

在这里插入图片描述

这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示:

在这里插入图片描述

那么相似度就是:(−3)+5+5+(−2)+(−3)+5+(−3)+5=9。因为两个基因的对应方法不唯一,例如又有:

在这里插入图片描述

相似度为:(−3)+5+5+(−2)+5+(−1)+5=14。规定两个基因的相似度为所有对应方法中,相似度最大的那个。

输入输出格式

输入格式:

共两行。每行首先是一个整数,表示基因的长度;隔一个空格后是一个基因序列,序列中只含A,C,G,T四个字母。1≤1≤序列的长度≤100。

输出格式:

仅一行,即输入基因的相似度。

输入输出样例

输入样例#1:

7 AGTGATG
5 GTTAG

输出样例#1:

14

思路:

​ 我们设dp【i】【j】为第一个基因的1~i位和第二个基因的1~j位的最大相似值,那么可以得到递推公式dp【i】【j】=max(dp【i-1】【j】+ maps【i】【-】,dp【i】【j-1】 + maps【-】【j】,dp【i - 1】【j - 1】+ maps【i】【j】)

代码:

#include <stdio.h>
#include <algorithm>
#include <map>
using namespace std;

int maps[5][5] = {
        5, -1, -2, -1, -3,
        -1, 5, -3, -2, -4,
        -2, -3, 5, -2, -2,
        -1, -2, -2, 5, -1,
        -3, -4, -2, -1, 0
};

char s1[105], s2[105];
int dp[105][105] = {0};
map<char, int>zcy;

int main () {
    int n, m;
    zcy['A'] = 0;
    zcy['C'] = 1;
    zcy['G'] = 2;
    zcy['T'] = 3;
    scanf("%d%s", &n, s1 + 1);
    scanf("%d%s", &m, s2 + 1);
    for (int i = 1; i <= n; i++) {
        dp[i][0] = dp[i - 1][0] + maps[zcy[s1[i]]][4];
    }
    for (int i = 1; i <= m; i++) {
        dp[0][i] = dp[0][i - 1] + maps[4][zcy[s2[i]]];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            dp[i][j] = max(max(dp[i - 1][j] + maps[zcy[s1[i]]][4],
                               dp[i][j - 1] + maps[4][zcy[s2[j]]]),
                           dp[i - 1][j - 1] + maps[zcy[s1[i]]][zcy[s2[j]]]);
        }
    }
    printf("%d\n", dp[n][m]);
    return 0;
}

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

猜你喜欢

转载自blog.csdn.net/Ivan_zcy/article/details/85526911