解析思路:
状态转移方程b[i][j]=max(b[i-1][j-1]+t[i][j],b[i][j-1]+t[4][j],b[i-1][j]+t[i][4]);i表示第一个字符串位子,j表示第二个字符串的位子;b[i][j]表示1到i,1到j位子的值
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int t[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 max(int a,int b,int c)
{
int temp;
temp=a>b?a:b;
return temp=c>temp?c:temp;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int i,j,k,m,temp1[200],temp2[200];
char s[2][200];
for(j=0;j<2;j++) scanf("%d %s",&m,s[j]);
for(k=1;k<=strlen(s[0]);k++)
{
if(s[0][k-1]=='A') temp1[k]=0;
else if(s[0][k-1]=='C') temp1[k]=1;
else if(s[0][k-1]=='G') temp1[k]=2;
else if(s[0][k-1]=='T') temp1[k]=3;
}
for(k=1;k<=strlen(s[1]);k++)
{
if(s[1][k-1]=='A') temp2[k]=0;
else if(s[1][k-1]=='C') temp2[k]=1;
else if(s[1][k-1]=='G') temp2[k]=2;
else if(s[1][k-1]=='T') temp2[k]=3;
}
int p,q,best[200][200];
best[0][0]=0;
for(j=1;j<=strlen(s[0]);j++)
best[j][0]=best[j-1][0]+t[temp1[j]][4];
for(j=1;j<=strlen(s[1]);j++)
best[0][j]=best[0][j-1]+t[4][temp2[j]];
for(p=1;p<=strlen(s[0]);p++)
{
for(q=1;q<=strlen(s[1]);q++)
{
best[p][q]=max(t[temp1[p]][temp2[q]]+best[p-1][q-1],
best[p-1][q]+t[temp1[p]][4],best[p][q-1]+t[4][temp2[q]]);
}
}
printf("%d\n",best[p-1][q-1]);
}
return 0;
}