题目直达车
#include<bits/stdc++.h>
using namespace std;
#define maxn 3010
int l1,l2,A,B;
string s1,s2;
int dp[maxn][maxn][2][2];
int d[4][4];
int get(char a){
if(a=='A')return 0;
else if(a=='T')return 1;
else if(a=='G')return 2;
else if(a=='C')return 3;
}
int main(){
memset(dp,-0x3f,sizeof(dp));
cin>>s1>>s2;
l1=s1.size(),l2=s2.size();
for(int i=0;i<4;i++){
for(int j=0;j<4;j++)cin>>d[i][j];
}
cin>>A>>B;
dp[l1][l2][0][0]=dp[l1][l2][1][0]=dp[l1][l2][0][1]=0;
for(int i=l1;i>=0;i--){
for(int j=l2;j>=0;j--){
if(i==l1&&j!=l2){
dp[i][j][0][0]=dp[i][j][1][0]=dp[i][j][0][1]=-A-B*(l2-j-1);
}else if(i!=l1&&j==l2){
dp[i][j][0][0]=dp[i][j][1][0]=dp[i][j][0][1]=-A-B*(l1-i-1);
}else if(i!=l1&&j!=l2){
dp[i][j][0][0]=max(dp[i+1][j+1][0][0]+d[get(s1[i])][get(s2[j])],max(dp[i+1][j][1][0],dp[i][j+1][0][1])-A);
dp[i][j][1][0]=max(dp[i+1][j+1][0][0]+d[get(s1[i])][get(s2[j])],dp[i+1][j][1][0]-B);
dp[i][j][0][1]=max(dp[i+1][j+1][0][0]+d[get(s1[i])][get(s2[j])],dp[i][j+1][0][1]-B);
}
}
}
cout<<max(dp[0][0][0][0],max(dp[0][0][1][0],dp[0][0][0][1]));
return 0;
}