#include <iostream> #include <string> using namespace std; int s1,s2; int memo[150][150]; const 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} }; string str1,str2; inline int getnumber(char c){ //获取下标 if(c=='A') return 0; if(c=='C') return 1; if(c=='G') return 2; if(c=='T') return 3; return 4; } int calcul(char a,char b){ //计算2个字符匹配的值 int row,col; row=getnumber(a); col=getnumber(b); return map[row][col]; } void DP(){ for(int i=1;i<=s1;++i) for(int j=1;j<=s2;++j) memo[i][j]=max(memo[i-1][j-1]+calcul(str1[i],str2[j]),max(memo[i][j-1]+calcul('-',str2[j]) , memo[i-1][j]+calcul('-',str1[i]) ) ); } int main(){ int n,temp; while(cin>>n){ string s; for(int p=0;p<n;++p){ s="@"; cin>>s1>>str1; str1=s+str1; cin>>s2>>str2; s="@"; str2=s+str2; for(int i=1;i<=s1;++i) //初始化memo for(int j=1;j<=s2;++j) memo[i][j]=-9999; memo[0][0]=0; for(int j=1;j<=s2;++j) memo[0][j]=memo[0][j-1]+calcul(str2[j],'-'); for(int i=1;i<=s1;++i) memo[i][0]=memo[i-1][0]+calcul(str1[i],'-'); DP(); cout<<memo[s1][s2]<<endl; } } return 0; }