• poj1080


    dp,类似最长公共子序列

    View Code
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    
    #define maxl 105
    
    char name[6] = "ACGT-";
    char gene1[maxl], gene2[maxl];
    int len1, len2;
    int match[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 } };
    int f[maxl][maxl];
    
    void input(int &len, char *gene)
    {
        scanf("%d", &len);
        scanf("%s", gene + 1);
    }
    
    int get_id(char ch)
    {
        for (int i = 0; i < 5; i++)
            if (ch == name[i])
                return i;
        return -1;
    }
    
    void work()
    {
        f[0][0] = 0;
        for (int i = 1; i <= len1; i++)
            f[i][0] = match[get_id(gene1[i])][get_id('-')] + f[i - 1][0];
        for (int i = 1; i <= len2; i++)
            f[0][i] = match[get_id(gene2[i])][get_id('-')] + f[0][i - 1];
        for (int i = 1; i <= len1; i++)
            for (int j = 1; j <= len2; j++)
            {
                f[i][j] = match[get_id(gene1[i])][get_id(gene2[j])]
                        + f[i - 1][j - 1];
                f[i][j] = max(f[i][j],
                        match[get_id(gene1[i])][get_id('-')] + f[i - 1][j]);
                f[i][j] = max(f[i][j],
                        match[get_id(gene2[j])][get_id('-')] + f[i][j - 1]);
            }
        printf("%d\n", f[len1][len2]);
    }
    
    int main()
    {
        //freopen("t.txt", "r", stdin);
        int t;
        scanf("%d", &t);
        while (t--)
        {
            input(len1, gene1);
            input(len2, gene2);
            work();
        }
        return 0;
    }
  • 相关阅读:
    MySQL之增_insert-replace
    Linux如何配置bond
    行转列及列转行查询
    SELECT中常用的子查询操作
    SELECT中的多表连接
    MySQL最常用分组聚合函数
    SELECT中的if_case流程函数
    MySQL常用日期时间函数
    MySQL常用数值函数
    dnslog注入
  • 原文地址:https://www.cnblogs.com/rainydays/p/2837810.html
Copyright © 2020-2023  润新知