您的位置:首页 > 其它

HDU 1080 Human Gene Functions(带权值的最长公共子序列)

2016-03-25 16:31 429 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1080

思路:最长公共子序列

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
map<char,int> map1;
map1['A'] = 0;
map1['C'] = 1;
map1['G'] = 2;
map1['T'] = 3;
map1['-'] = 4;
int t,first,second,i,j,m1,m2,m3;
char gene1[105],gene2[105];
int dp[105][105],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}};
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%s",&first,gene1);
scanf("%d%s",&second,gene2);
for(i=1; i<=second; i++)//第一个已经用完
dp[0][i] = dp[0][i-1] + score[4][map1[gene2[i-1]]];
for(i=1; i<=first; i++)//第二个已经用完
dp[i][0] = dp[i-1][0] + score[map1[gene1[i-1]]][4];
for(i=1; i<=first; i++)
{
for(j=1; j<=second; j++)
{
m1 = dp[i-1][j] + score[map1[gene1[i-1]]][4];//第二个字符串取-
m2 = dp[i][j-1] + score[4][map1[gene2[j-1]]];//第一个字符串取-
m3 = dp[i-1][j-1] + score[map1[gene1[i-1]]][map1[gene2[j-1]]];//都不取
dp[i][j] = max(m1,max(m2,m3));
}
}
printf("%d\n",dp[first][second]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: