原文链接:https://www.luogu.com.cn/problem/P1140
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
int mapp[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 dp[105][105];
int change(char c){
if(c=='A') return 0;if(c=='C') return 1;if(c=='G') return 2;
if(c=='T') return 3;if(c=='-') return 4;
}
void deal(string s0,string s1){
int i,j;
dp[0][0]=0;
for(i=1;i<s0.length();i++){
dp[i][0]=dp[i-1][0]+mapp[change(s0[i-1])][4];
}
for(i=1;i<s1.length();i++){
dp[0][i]=dp[0][i-1]+mapp[change(s1[i-1])][4];
}
for(i=1;i<=s0.length();i++){
for(j=1;j<=s1.length();j++){
dp[i][j]=max(dp[i-1][j-1]+mapp[change(s0[i-1])][change(s1[j-1])],
max(dp[i][j-1]+mapp[4][change(s1[j-1])],dp[i-1][j]+mapp[change(s0[i-1])][4]));
}
}
cout<<dp[s0.length()][s1.length()]<<endl;
}
int main(){
int i,j;
string s0,s1;
cin>>j>>s0;
cin>>j>>s1;
if(s0.length()>s1.length()){
deal(s0,s1);
}
else{
deal(s1,s0);
}
return 0;
}