#include<iostream>
using namespace std;
int gene1[105];
int gene2[105];//
int dp[105][105];
int n,m;
int lt[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,5000} };
int f(int i,int j) {//表示这在考虑这两个字符
if (i == n && j == m) { return 0; }
if (i == n) { int result = 0; for (int k = j; k < m; k++) { result += lt[4][gene2[k]]; dp[i][j] = result; return result; } }
if (j == m) { int result = 0; for (int k = i; k < n; k++) { result += lt[gene1[k]][4]; dp[i][j] = result; return result; } }
if (dp[i][j] != -5000) { return dp[i][j]; }
int ans = -10000000;
int temp1 = 0;
int temp2 = 0;
int a, b;
temp1 = f(i, j + 1) + lt[4][gene2[j]];//补孔缺
temp2 = f(i + 1, j) + lt[gene1[i]][4];
ans = f(i + 1, j + 1) + lt[gene1[i]][gene2[j]];
ans = max(ans, max(temp1, temp2));
dp[i][j] = ans;
return ans;
}
int main() {
int ans;
cin >> n;
char ch; int a;
for (int i = 1; i <= n; i++) {
cin >> ch;
if (ch == 'A') { a = 0; }
else if (ch == 'C') { a = 1; }
else if (ch == 'G') { a = 2; }
else if (ch == 'T') { a = 3; }
gene1[i] = a;
}
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> ch;
if (ch == 'A') { a = 0; }
else if (ch == 'C') { a = 1; }
else if (ch == 'G') { a = 2; }
else if (ch == 'T') { a = 3; }
gene2[i] = a;
}
for (int i = 0; i <= 103; i++) {
for (int j = 0; j <= 103; j++) {
dp[i][j] = -5000;
}
}
//字符串对应的状态转移方程?递归
ans=f(0,0);
std::cout << ans << endl;
}
我的思路和大佬一模一样aa为什么不对qwq