/*
* @Author: Aisaka_Taiga
* @Date: 2023-10-18 22:14:49
* @LastEditTime: 2023-10-18 22:30:40
* @LastEditors: Aisaka_Taiga
* @FilePath: \Desktop\P4059.cpp
* The heart is higher than the sky, and life is thinner than paper.
*/
#include <bits/stdc++.h>
#define int long long
#define N 3010
using namespace std;
inline int read()
{
int x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9'){if(c == '-') f = -1; c = getchar();}
while(c <= '9' && c >= '0') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * f;
}
int a[N], b[N], mp[5][5], f[N][N][3];
string s1, s2;
inline int get_s(char s)
{
if(s == 'A') return 1;
if(s == 'T') return 2;
if(s == 'G') return 3;
if(s == 'C') return 4;
return 0;
}
signed main()
{
cin >> s1 >> s2;
int n = s1.size(), m = s2.size();
for(int i = 1; i <= n; i ++) a[i] = get_s(s1[i - 1]);
for(int i = 1; i <= m; i ++) b[i] = get_s(s2[i - 1]);
for(int i = 1; i <= 4; i ++)
for(int j = 1; j <= 4; j ++)
mp[i][j] = read();
int A = read(), B = read();
memset(f, -0x3f, sizeof f);
f[0][0][0] = 0;
for(int i = 0; i <= n; i ++)
{
for(int j = 0; j <= m; j ++)
{
if(i && 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])) + mp[a[i]][b[j]];
if(j) f[i][j][1] = max(f[i][j - 1][0] - A, max(f[i][j - 1][1] - B, f[i][j - 1][2] - B));
if(i) f[i][j][2] = max(f[i - 1][j][0] - A, max(f[i - 1][j][1] - A, f[i - 1][j][2] - B));
}
}
cout << max(f[n][m][1], max(f[n][m][2], f[n][m][0])) << endl;
return 0;
}
样例一直是5,气得我交了一发,A了?