• 洛谷 P1140 相似基因


    洛谷 P1140 相似基因

    题目描述

    这道题目状态比较好设计,设f[i][j]表示,当第一个字符串匹配到第i个,第二个字符串匹配到第j个时的最大匹配度

    转移

        f[i][j]=max(f[i][j],f[i-1][j-1]+val[pre(a[i])][pre(b[j])];
        //表示让第a[i]位和第b[j]位匹配,从当前匹配位都减1中转加上匹配值
        f[i][j]=max(f[i][j],f[i-1][j]+val[pre(a[i])][5]);
        //表示让a[i]位与空匹配,从i少匹配一位中转(加上匹配这一位正好匹配完第i位),加上匹配值
        f[i][j]=max(f[i][j],f[i][j-1]+val[5][pre(b[j])]);
        //表示让b[j]位与空匹配,从j少匹配一位中转(加上匹配这一位正好匹配完第j位,加上匹配值
    

    个人认为比较难理解的是预处理

        for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
        f[i][j]=-999999;
        //因为有负数,所以预处理一个较小的数,不能是INT_MIN,因为加负数会爆int
    
        for (int i=1;i<=n;i++)
        f[i][0]=f[i-1][0]+val[pre(a[i])][5];
        //f[i][0]表示a串的前i位全部和空匹配(比较像求前缀和)
        for (int i=1;i<=m;i++)
        f[0][i]=f[0][i-1]+val[5][pre(b[i])];
    
    #include<iostream>
    #include<cstring>
    #include<climits>
    #include<cstdio>
    using namespace std;
    const int N=120;
    int n,m;
    int f[N][N];
    int val[6][6]=
    {
        {0,0,0,0,0,0},
        {0,5,-1,-2,-1,-3},
        {0,-1,5,-3,-2,-4},
        {0,-2,-3,5,-2,-2},
        {0,-1,-2,-2,5,-1},
        {0,-3,-4,-2,-1,0}
    };
    char a[N],b[N];
    inline int pre(char x)
    {
        if (x=='A') return 1;
        if (x=='C') return 2;
        if (x=='G') return 3;
        if (x=='T') return 4;
        return 5;
    }
    int main()
    {
        scanf("%d%s",&n,a+1);
        scanf("%d%s",&m,b+1);
        for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
        f[i][j]=-999999;
        for (int i=1;i<=n;i++)
        f[i][0]=f[i-1][0]+val[pre(a[i])][5];
        for (int i=1;i<=m;i++)
        f[0][i]=f[0][i-1]+val[5][pre(b[i])];
        for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
        {
            f[i][j]=max(f[i][j],f[i-1][j-1]+val[pre(a[i])][pre(b[j])]);
            f[i][j]=max(f[i][j],f[i-1][j]+val[pre(a[i])][5]);
            f[i][j]=max(f[i][j],f[i][j-1]+val[5][pre(b[j])]);
        }
        printf("%d
    ",f[n][m]);
        return 0;
    }
    
  • 相关阅读:
    MYSQL数据类型——字符串类型
    MYSQL——记录长度
    MYSQL数据类型——时间日期类型
    MYSQL数据类型——数值类型
    为什么在 IDEA jsp 中直接使用 out.println 会出错
    花指令行为大赏
    EasyCpp 题解
    [SUCTF2019] hardcpp 题解
    洛谷 P1650 田忌赛马题解
    Dict 协议是什么
  • 原文地址:https://www.cnblogs.com/last-diary/p/10851872.html
Copyright © 2020-2023  润新知