关闭

【Hdu】1080 Human Gene Functions

标签: 最长公共子序列DP动态规划Hdu
368人阅读 评论(0) 收藏 举报
分类:
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

//A:0    C:1    G:2    T:3    -:4
const int g[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,-1121};
const int L=120;
const int M=-100000000;

char s[L],t[L]; int ls,lt;
int cs[L],ct[L],f[L][L];                    

inline int find(char a)
{
    if (a=='A') return 0;
    if (a=='C') return 1;
    if (a=='G') return 2;
    if (a=='T') return 3;
    return 4;
}

inline int max(int i,int j)
{
    return i>j?i:j;
}

int main(void)
{    
    int cas;
    scanf("%d",&cas);
    for (int cc=1;cc<=cas;cc++)
    {
        scanf("%d%s%d%s",&ls,&s[1],<,&t[1]);
        for (int i=1;i<=ls;i++) cs[i]=find(s[i]);
        for (int i=1;i<=lt;i++) ct[i]=find(t[i]);
    
        for (int i=0;i<=ls;i++)
            for (int j=0;j<=lt;j++) f[i][j]=M;
        f[0][0]=0;
    
        for (int i=1;i<=ls;i++) f[i][0]=f[i-1][0]+g[cs[i]][4];
        for (int j=1;j<=lt;j++) f[0][j]=f[0][j-1]+g[4][ct[j]];
        for (int i=1;i<=ls;i++)
            for (int j=1;j<=lt;j++)
            {
                f[i][j]=max(f[i-1][j]+g[cs[i]][4],f[i][j-1]+g[4][ct[j]]);
                f[i][j]=max(f[i][j],f[i-1][j-1]+g[cs[i]][ct[j]]);
            }
        printf("%d\n",f[ls][lt]);
    }
    
    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:52446次
    • 积分:1891
    • 等级:
    • 排名:千里之外
    • 原创:137篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    最新评论