Human Gene Functions
题意
给出两个基因字符串a,b,每一种匹配都有一个值,可以在串中添加‘-’,改变
匹配的顺序,最后求全部匹配的最大值。
分析
思路:先将字符串转化,每个字符分别用0,1,2,3,表示‘-’用4表示
状态:d[i][j]表示串a前i个和串b前j个匹配的最大值
转移方程:d[i][j] = max( d[i-1][j-1]+c[a[i]][b[j]], d[i-1][j]+c[a[i]][4], d[i][j-1]+c[4][b[j]] );
1、a取第i个字母,b取“ - ”: d[i-1][j]+c[a[i]][’-’];
2、a取“ - ”,b取第j个字母:d[i][j-1]+c[’-’][b[j]];
3、a取第i个字母,b取第j个字母:d[i-1][j-1]+c[a[i]][b[j]];
代码
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn=105;
int table[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 transfer(char c)
{
if(c=='A')return 0;
if(c=='C')return 1;
if(c=='G')return 2;
if(c=='T')return 3;
return 4;
}
int main()
{
//freopen("data.txt","r",stdin);
char s1[maxn],s2[maxn];
int t1[maxn],t2[maxn];
int dp[maxn][maxn];
int l1,l2;
int T;
scanf("%d",&T);
while(T--){
scanf("%d ",&l1);
for(int i=1;i<=l1;i++){
scanf("%c",&s1[i]);
t1[i]=transfer(s1[i]);
}
scanf("%d ",&l2);
for(int i=1;i<=l2;i++){
scanf("%c",&s2[i]);
t2[i]=transfer(s2[i]);
}
dp[0][0]=0;
for(int i=1;i<=l1;i++) dp[i][0]=dp[i-1][0]+table[t1[i]][4];//注意开头是可以填空格的
for(int i=1;i<=l2;i++) dp[0][i]=dp[0][i-1]+table[4][t2[i]];
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
dp[i][j]=max(dp[i-1][j-1]+table[t1[i]][t2[j]],max(dp[i-1][j]+table[t1[i]][4],dp[i][j-1]+table[4][t2[j]]));
}
}
printf("%d\n",dp[l1][l2]);
}
return 0;
}