您的位置:首页 > 其它

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

2014-09-26 16:48 393 查看
题目: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 110

using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: