什么毒瘤
查看原帖
什么毒瘤
801371
Midnight_szx楼主2023/1/14 11:42

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;
}
2023/1/14 11:42
加载中...