zoukankan      html  css  js  c++  java
  • 洛谷 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;
    }
    
  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/last-diary/p/10851872.html
Copyright © 2011-2022 走看看