这道题是最短编辑路径。 和LCS差不多。 详见代码: #include <iostream> #include <stdio.h> #include <algorithm> #include <cmath> #include <cstring> using namespace std; void MyScanf(int &num) { char a; while(a=getchar(),!isdigit(a)); num = a-'0'; while ((a = getchar())!=' ' && a!='/n') num = num*10 + a-'0'; } string a,b; int len1,len2; int f[101][101]; void Input() { string temp; a = " "; b = " "; cin >> len1 >> temp; a += temp; cin >> len2 >> temp; b += temp; } void Init() { } int value[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,999}}; int ToInt(char c) { if (c == 'A') return 0; else if (c == 'C') return 1; else if (c == 'G') return 2; else if (c == 'T') return 3; } void Compute() { int i,j; for (i = 0;i <= len1;i++) for (j = 0;j <= len2;j++) { if (i == 0 && j == 0) f[i][j] = 0; else f[i][j] = -999999999; if (i > 0 && j > 0) f[i][j] = max(f[i][j],f[i - 1][j - 1] + value[ToInt(a[i])][ToInt(b[j])]); if (i > 0) f[i][j] = max(f[i][j],f[i - 1][j] + value[4][ToInt(a[i])]); if (j > 0) f[i][j] = max(f[i][j],f[i][j - 1] + value[ToInt(b[j])][4]); } // while (cin >> i >> j) // cout << f[i][j] << endl; cout << f[len1][len2] << endl; } int main() { int t; cin >> t; while (t--) { Input(); Init(); Compute(); } return 0; }