分三种情况考虑: 1、s1不是 -,s2是 - dp[i][0] = dp[i - 1][0] + m[x[i]][4];
2、s1是 -,s2不是 - dp[0][j] = dp[0][j - 1] + m[4][y[j]];
3、s1不是 -,s2不是 - dp[i][j] = Max(dp[i - 1][j - 1] + m[x[i]][y[j]], dp[i - 1][j] + m[x[i]][4], dp[i][j - 1] + m[4][y[j] ]);
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#define Max(a,b,c) max(a,max(b,c))
using namespace std;
int m[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 f(char c) {
int k;
if (c == 'A')k = 0;
else if (c == 'C')k = 1;
else if (c == 'G')k = 2;
else k = 3;
return k;
}
int dp[110][110];
int main() {
int t, i, j, N, M, x[110], y[110];
char str1[110], str2[110];
scanf("%d", &t);
while (t-- && scanf("%d %s %d %s", &N, str1, &M, str2)) {
memset(dp, 0, sizeof (dp));
for (i = 1; i <= N; i++)
x[i] = f(str1[i - 1]);
for (j = 1; j <= M; j++)
y[j] = f(str2[j - 1]);
for (i = 1; i <= N; i++)
dp[i][0] = dp[i - 1][0] + m[x[i]][4];
for (j = 1; j <= M; j++)
dp[0][j] = dp[0][j - 1] + m[4][y[j]];
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++)
dp[i][j] = Max(dp[i - 1][j - 1] + m[x[i]][y[j]], dp[i - 1][j] + m[x[i]][4], dp[i][j - 1] + m[4][y[j] ]);
printf("%d\n", dp[N][M]);
}
return 0;
}