[POJ 1080]Human Gene Functions(动态规划)

来源:互联网 发布:北京seo外包服务 编辑:程序博客网 时间:2024/05/24 05:38

题目:http://poj.org/problem?id=1080

题目大意:给出人类的DNA的一对序列A,B,每一对Ai,Bi有对应的分值score(Ai,Bi),序列A和B中亦可插入空格'-',求A和B匹配获得的最大分数

思路:联想最长公共子序列!

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>#include <map>#define MAXN 110using namespace std;map<char,int>dictionary; //DNA字母对应的编号int score[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 f[MAXN][MAXN]; //f[i][j]=s1前i个字母和s2前j个字母匹配获得的最大分数int max(int a,int b){    if(a>b) return a;    return b;}int main(){    dictionary['A']=0,dictionary['C']=1,dictionary['G']=2,dictionary['T']=3,dictionary['-']=4;    int T;    scanf("%d",&T);    while(T--)    {        int len1,len2;        char s1[MAXN],s2[MAXN];        memset(f,0,sizeof(f));        scanf("%d%s%d%s",&len1,s1+1,&len2,s2+1);        for(int i=1;i<=len1;i++)            f[i][0]=score[dictionary[s1[i]]][dictionary['-']]+f[i-1][0]; //DP初始化:f[i][0]=长为i的s1子串和长为i的空'-'字符串匹配获得的分数        for(int i=1;i<=len2;i++)            f[0][i]=score[dictionary['-']][dictionary[s2[i]]]+f[0][i-1];        for(int i=1;i<=len1;i++)            for(int j=1;j<=len2;j++)            {                f[i][j]=f[i-1][j-1]+score[dictionary[s1[i]]][dictionary[s2[j]]]; //1:第i、j号字母都用上                f[i][j]=max(f[i][j],f[i-1][j]+score[dictionary[s1[i]]][dictionary['-']]); //2:s1第i号字母前插入空格                f[i][j]=max(f[i][j],f[i][j-1]+score[dictionary['-']][dictionary[s2[j]]]); //3:s2第j号字母前插入空格            }        printf("%d\n",f[len1][len2]);    }    return 0;}


 

 

 

 

0 0
原创粉丝点击