rt,悬赏一关注
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define int long long
using namespace std;
char c1[3010], c2[3010];
int len1, len2, a, b, x[3010], y[3010], d[3010][3010], f[3010][3010][3];
inline int cxk(char c) {
if(c == 'A')
return 1;
else if(c == 'T')
return 2;
else if(c == 'G')
return 3;
else
return 4;
}
signed main() {
std::ios::sync_with_stdio(0);
cin>>c1>>c2;
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
cin>>d[i][j];
cin>>a>>b;
len1 = strlen(c1), len2 = strlen(c2);
for(int i = 1; i <= len1; i++)
x[i] = cxk(c1[i - 1]);
for(int i = 1; i <= len2; i++)
y[i] = cxk(c2[i - 1]);
for(int i = max(len1, len2); i; i--) {
f[0][i][0] = f[i][0][0] = f[0][i][2] = f[i][0][1] = -(1LL << 60);
f[0][i][1] = f[i][0][2] = - a - b * (i - 1);
}
f[0][0][1] = f[0][0][2] = -(1LL << 60);
for(int i = 1; i <= len1; i++)
for(int j = 1; j <= len2; j++) {
f[i][j][0] = max(f[i - 1][j - 1][0], max(f[i - 1][j - 1][1], f[i - 1][j - 1][2])) + d[x[i]][y[i]];
f[i][j][1] = max(f[i][j - 1][1] - b, max(f[i][j - 1][0] - a, f[i][j - 1][2] - a));
f[i][j][2] = max(f[i - 1][j][2] - b, max(f[i - 1][j][0] - a, f[i - 1][j][1] - a));
}
cout<<max(f[len1][len2][0], max(f[len1][len2][1], f[len1][len2][2]));
return 0;
}