直接模版
dp[i][j]=max(
max(
max(
dp[i-1][j]+map[s[i]]['-'], d[i][j-1]+map['-'][ss[j]]
)
,
dp[i-1][j-1]+map[s[i]][ss[j]]
)
,
dp[i][j]
);
#include"stdio.h"
#include"string.h"
#include"math.h"
int map[6][6]={
0,0,0,0,0,0,
0,5,-1,-2,-1,-3,
0,-1,5,-3,-2,-4,
0,-2,-3,5,-2,-2,
0,-1,-2,-2,5,-1,
0,-3,-4,-2,-1,-100000
};
int fun(char c)
{
if(c=='A')return 1;
if(c=='C')return 2;
if(c=='G')return 3;
if(c=='T')return 4;
return 5;
}
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int T;
int i,j,t;
int a,b,c;
int l1,l2;
int dp[112][112];
char s[112],ss[112];
scanf("%d",&T);
while(T--)
{
scanf("%d %s",&l1,s+1);
scanf("%d %s",&l2,ss+1);
memset(dp,0,sizeof(dp));
for(i=1;i<=l1;i++)
{
a=fun(s[i]);
b=fun('-');
dp[i][0]=dp[i-1][0]+map[a][b];
}
for(i=1;i<=l2;i++)
{
a=fun('-');
b=fun(ss[i]);
dp[0][i]=dp[0][i-1]+map[a][b];
}
for(i=1;i<=l1;i++)
{
for(j=1;j<=l2;j++)
{
a=fun(s[i]);
b=fun(ss[j]);
c=fun('-');
dp[i][j]=max(dp[i-1][j]+map[a][c],dp[i][j-1]+map[c][b]);
dp[i][j]=max(dp[i-1][j-1]+map[a][b],dp[i][j]);
}
}
printf("%d\n",dp[l1][l2]);
}
return 0;
}