#include<iostream>
#include<string>
#include<stdio.h>
#include<string.h>
using namespace std;
char str1[105],str2[105];
int map[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 dp[105][105];
int pd(char x,char y)
{
int i,j;
switch(x)
{
case 'A':i=0;
break;
case 'C':i=1;
break;
case 'G':i=2;
break;
case 'T':i=3;
break;
case ' ':i=4;
break;
}
switch(y)
{
case 'A':j=0;
break;
case 'C':j=1;
break;
case 'G':j=2;
break;
case 'T':j=3;
break;
case ' ':j=4;
break;
}
return map[i][j];
}
int max1(int a,int b,int c)
{
int max;
if(a>b)
{
max=a;
}
else
{
max=b;
}
if(c>max)
{
max=c;
}
return max;
}
void work(int len1,int len2)
{
for(int j=1;j<=len2;j++)
{
dp[0][j]=dp[0][j-1]+pd(' ',str2[j]);
}
for(int i=1;i<=len1;i++)
{
dp[i][0]=dp[i-1][0]+pd(str1[i],' ');
}
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(str1[i]==str2[j])
{
dp[i][j]=dp[i-1][j-1]+pd(str1[i],str2[j]);
}
else
{
dp[i][j]=max1(dp[i-1][j-1]+pd(str1[i],str2[j]),dp[i][j-1]+pd(' ',str2[j]),dp[i-1][j]+pd(str1[i],' '));
}
}
}
}
int main()
{
int t,len1,len2;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%s",&len1,str1+1);
scanf("%d%s",&len2,str2+1);
work(len1,len2);
printf("%d\n",dp[len1][len2]);
}
return 0;
}
poj 1080 Human Gene Functions 动态规划(最长公共子序列)
最新推荐文章于 2022-12-02 12:01:30 发布