zoukankan      html  css  js  c++  java
  • POJ 1080 Human Gene Functions

    题意:给两个DNA序列,在这两个DNA序列中插入若干个'-',使两段序列长度相等,对应位置的两个符号的得分规则给出,求最高得分。

    解法:dp。dp[i][j]表示第一个字符串s1的前i个字符和第二个字符串s2的前j个字符对齐时的最高得分,转移方程:dp[i][j] = max{dp[i - 1][j - 1] + a[s1[i]][s2[j]], dp[i - 1] + a[s1[i]]['-'] + dp[i][j - 1] + a['-'][s2[j]]},第一项表示对齐时s1[i]和s2[j]作为结尾,第二项表示对齐时'-'和s2[j]作为结尾,第三项表示对齐时s1[i]和'-'作为结尾。

    注意dp应该以1开始,但字符串一般直接读入的话是以0开始的,因为这个样例一直过不去……调了好久……

    代码:

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<string.h>
    #include<math.h>
    #include<limits.h>
    #include<time.h>
    #include<stdlib.h>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    #define LL long long
    using namespace std;
    int a[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 main()
    {
        int T;
        while(~scanf("%d", &T))
        {
            while(T--)
            {
                string s1, s2;
                int len1, len2;
                cin >> len1 >> s1 >> len2 >> s2;
                for(int i = 0; i < len1; i++)
                    if(s1[i] == 'A') s1[i] = 0;
                    else if(s1[i] == 'C') s1[i] = 1;
                    else if(s1[i] == 'G') s1[i] = 2;
                    else if(s1[i] == 'T')s1[i] = 3;
                for(int i = 0; i < len2; i++)
                    if(s2[i] == 'A') s2[i] = 0;
                    else if(s2[i] == 'C') s2[i] = 1;
                    else if(s2[i] == 'G') s2[i] = 2;
                    else if(s2[i] == 'T') s2[i] = 3;
                int dp[105][105] = {0};
                for(int i = 1; i <= len1; i++)
                    dp[i][0] = dp[i - 1][0] + a[s1[i - 1]][4];
                for(int i = 1; i <= len2; i++)
                    dp[0][i] = dp[0][i - 1] + a[4][s2[i - 1]];
                for(int i = 1; i <= len1; i++)
                    for(int j = 1; j <= len2; j++)
                        dp[i][j] = max(dp[i - 1][j - 1] + a[s1[i - 1]][s2[j - 1]], max(dp[i - 1][j] + a[s1[i - 1]][4], dp[i][j - 1] + a[4][s2[j - 1]]));
                printf("%d
    ", dp[len1][len2]);
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    swift 资料
    CI cookie 存放数组
    CI框架中 日志输出方法log_message()只允许输出字符串解决方案
    CI框架整合微信公共平台接口
    php中的 file_get_contents(‘php://input’)
    CI 框架购物车问题
    JQ 报表插件 jquery.jqplot 使用
    微信开发调试工具
    常用开源库
    字符集更改步骤,mysql乱码
  • 原文地址:https://www.cnblogs.com/Apro/p/4846347.html
Copyright © 2011-2022 走看看