1) str1取第i - 1个字母,str2取'-';
int m1 = gene[i - 1][j] + score[map[str1[i - 1]]][4];
2) str1取取'-', str2取第i - 1个字母
int m2 = gene[i][j - 1] + score[4][map[str2[j - 1]]];
3) str1取第i - 1个字母,str2取第 j - 1个字母;
int m3 = gene[i - 1][j - 1] + score[map[str1[i - 1]]][map[str2[j - 1]]];
gene[i][j] = max(m1, max(m2, m3));
#include <iostream>
#include <algorithm>
using namespace std;
#define size 110
char map[size], str1[size], str2[size];
int gene[size][size];
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 main()
{
//freopen("in.txt", "r", stdin);
map['A'] = 0;
map['C'] = 1;
map['G'] = 2;
map['T'] = 3;
map['-'] = 4;
int iCase, i, j, len1, len2;
cin>>iCase;
while(iCase--){
cin>>len1>>str1;
cin>>len2>>str2;
//i = 0, j = 0时,没有任何基因字母
gene[0][0] = 0;
//第一段没有字母时
for(i = 1; i <= len2; i++)
gene[0][i] = gene[0][i - 1] + score[4][map[str2[i - 1]]];
//第二段没有字母时
for(i = 1; i <= len1; i++)
gene[i][0] = gene[i - 1][0] + score[map[str1[i - 1]]][4];
for(i = 1; i <= len1; i++){
for(j = 1; j <= len2; j++){
int m1 = gene[i - 1][j] + score[map[str1[i - 1]]][4];
int m2 = gene[i][j - 1] + score[4][map[str2[j - 1]]];
int m3 = gene[i - 1][j - 1] + score[map[str1[i - 1]]][map[str2[j - 1]]];
gene[i][j] = max(m1, max(m2, m3));
}
}
cout<<gene[len1][len2]<<endl;
}
return 0;
}