题解
2025-08-09 21:17:44
发布于:广东
4阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 碱基相似度表
int sim[5][5] = {
{5, -1, -2, -1, -3}, // A
{-1, 5, -3, -2, -4}, // C
{-2, -3, 5, -2, -2}, // G
{-1, -2, -2, 5, -1}, // T
{-3, -4, -2, -1, 0} // -
};
// 将碱基转换为索引
int getIndex(char c) {
switch (c) {
case 'A': return 0;
case 'C': return 1;
case 'G': return 2;
case 'T': return 3;
case '-': return 4;
default: return -1;
}
}
int main() {
int n, m;
string s1, s2;
cin >> n >> s1 >> m >> s2;
// 动态规划数组
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
// 初始化
for (int i = 1; i <= n; i++) {
dp[i][0] = dp[i-1][0] + sim[getIndex(s1[i-1])][4];
}
for (int j = 1; j <= m; j++) {
dp[0][j] = dp[0][j-1] + sim[4][getIndex(s2[j-1])];
}
// 动态规划
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int match = dp[i-1][j-1] + sim[getIndex(s1[i-1])][getIndex(s2[j-1])];
int insert1 = dp[i-1][j] + sim[getIndex(s1[i-1])][4];
int insert2 = dp[i][j-1] + sim[4][getIndex(s2[j-1])];
dp[i][j] = max({match, insert1, insert2});
}
}
// 输出结果
cout << dp[n][m] << endl;
return 0;
}
这里空空如也
有帮助,赞一个