• poj1080 Human Gene Functions


    题目:
    链 AGTGATG
    GTTAG
    可变形成
    AGTGAT-G
    -GT--TAG
    从而得到和最大
    分析:
    dp问题,属于最长公共子序列的变形题,用二维dp[i][j]存储当前
    串一的i位置和串二j位置上的和最大值,答案为dp[len1][len2],
    用地图map[i][j]存储AGCT的匹配程度,把输入的字符串用数组表示,
    并且a[i][j],b[i][j]与地图的对应更容易计算
    状态转移方程为
    dp[i][j]=max{dp[i][j],dp[i][j-1]+map[a[i]][5],dp[i-1][j]+map[5][b[j]],dp[i-1][j-1]+map[a[i]][b[j]]}

    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
    #define X 105
    #define INF -10001//表示无穷大
    int dp[X][X];//储存当前串一的i位置和串二j位置上的最优解
    int map[6][6];//储存字符匹配程度
    int a[X],b[X];//串一串二的表示数组
    string target,match;//输入的两个字符串
    int main()
    {
    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);

    int test;
    cin>>test;
    //以下为匹配程度,1表示A,2表示G,3表示C,4表示T
    for(int i=1;i<5;i++)
    map[i][i] = 5;
    map[1][2]=map[2][1]=-2;
    map[1][3]=map[3][1]=-1;
    map[1][4]=map[4][1]=-1;
    map[1][5]=map[5][1]=-3;
    map[2][3]=map[3][2]=-3;
    map[2][4]=map[4][2]=-2;
    map[2][5]=map[5][2]=-2;
    map[3][4]=map[4][3]=-2;
    map[3][5]=map[5][3]=-4;
    map[4][5]=map[5][4]=-1;
    while(test--)
    {
    int len1,len2;
    cin>>len1>>match>>len2>>target;
    memset(dp,INF,sizeof(dp));//初始化
    //以下把字符串化为数组,1表示A,2表示G,3表示C,4表示T
    for(int i=0;i<len1;i++)
    {
    if(match[i]=='A')
    a[i+1]=1;
    else if(match[i]=='G')
    a[i+1]=2;
    else if(match[i]=='C')
    a[i+1]=3;
    else if(match[i]=='T')
    a[i+1]=4;
    }
    for(int i=0;i<len2;i++)
    {
    if(target[i]=='A')
    b[i+1]=1;
    else if(target[i]=='G')
    b[i+1]=2;
    else if(target[i]=='C')
    b[i+1]=3;
    else if(target[i]=='T')
    b[i+1]=4;
    }
    //////////////////初始化dp
    dp[0][0]=0;
    for(int i=1;i<=len1;i++)//当串二为空串时(尽管不可能)
    dp[i][0]=dp[i-1][0]+map[a[i]][5];
    for(int i=1;i<=len2;i++)//当串一为空串时(尽管不可能)
    dp[0][i]=dp[0][i-1]+map[5][b[i]];
    /////////////////核心程序,实现状态转移
    for(int i=1;i<=len1;i++)
    for(int j=1;j<=len2;j++)
    {
    dp[i][j]=max(dp[i][j],dp[i-1][j-1]+map[a[i]][b[j]]);
    dp[i][j]=max(dp[i][j],dp[i][j-1]+map[5][b[j]]);
    dp[i][j]=max(dp[i][j],dp[i-1][j]+map[a[i]][5]);
    }
    cout<<dp[len1][len2]<<endl;
    }

    return 0;
    }

  • 相关阅读:
    重构之路第一篇——重新组织函数的几种方法
    Maven设置http代理
    maven本地仓库路径和修改
    Maven安装目录分析
    使用Python解析Loadrunner的post的中文数据
    Python3 批量创建文件夹
    tomcat设置上传文件大小
    Jenkins启动
    Sublime Text 3 编译Python3
    常用SQL
  • 原文地址:https://www.cnblogs.com/yejinru/p/2374700.html
Copyright © 2020-2023  润新知