#include <iostream>
using namespace std;
const int MAXN = 101;
int dp[MAXN][MAXN];
int score[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 change(char ch)
{
if (ch == 'A')
{
return 0;
}
else if (ch == 'C')
{
return 1;
}
else if (ch == 'G')
{
return 2;
}
else if (ch == 'T')
{
return 3;
}
else
{
return 4;
}
}
char A[MAXN], B[MAXN];
int maxs(int a, int b, int c)
{
return max(a, max(b, c));
}
void input()
{
int t, a, b;
cin >> t;
while (t--)
{
cin >> a;
for (int i = 0; i < a; i++)
{
cin >> A[i];
}
cin >> b;
for (int i = 0; i < b; i++)
{
cin >> B[i];
}
dp[0][0] = 0;
for (int i = 1; i <= a; i++)
{
dp[i][0] = dp[i - 1][0] + score[change(A[i - 1])][change('-')];
}
for (int i = 1; i <= b; i++)
{
dp[0][i] = dp[0][i - 1] + score[change('-')][change(B[i - 1])];
}
for (int i = 1; i <= a; i++)
{
for (int j = 1; j <= b; j++)
{
dp[i][j] = maxs(dp[i][j - 1] + score[change('-')][change(B[j - 1])],
dp[i - 1][j] + score[change(A[i - 1])][change('-')],
dp[i - 1][j - 1] + score[change(A[i - 1])][change(B[j - 1])]);
}
}
cout << dp[a][b] << endl;
}
}
int main()
{
input();
return 0;
}
poj1080
最新推荐文章于 2018-05-12 15:42:00 发布