Human Gene Function
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1080
简要翻译:编写一个程序,按一定规则比较两个基因的相似程度。
测量两个基因相似度的一种方法称为对齐。使用对齐方法,可以在基因适当位子插进空格,让两个基因长度相等,然后根据基因分值表计算分数。
动态规划原理:
(1)当str1取第i-1个字母,str2取‘-’时
sum1 = gene[i - 1][j] + score[Map[str1[i - 1]]][4];
(2) 当str1取第i-1个字母,str2取第j-1个字母时
sum2 = gene[i - 1][j - 1] + score[Map[str1[i - 1]]][Map[str2[j - 1]]];
(3)当str1取第‘-’个字母,str2取第j-1个字母时
sum3 = gene[i][j - 1] + score[4][Map[str2[j - 1]]];
#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int score[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,0} };
int main() {
map<char, int>Map;
int t,n, m,sum1,sum2,sum3;
string str1, str2;
Map['A'] = 0;
Map['C'] = 1;
Map['G'] = 2;
Map['T'] = 3;
Map['-'] = 4;
cin >> t;
while (t--) {
cin >> n >> str1;
cin >> m >> str2;
vector<vector<int>>gene(n + 1, vector<int>(m + 1));
gene[0][0] = 0; //确定边界值
for (int i = 1; i <= n; i++)
gene[i][0] = gene[i - 1][0] + score[Map[str1[i - 1]]][4];
for (int i = 1; i <= m; i++)
gene[0][i] = gene[0][i - 1] + score[4][Map[str2[i - 1]]];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
sum1 = gene[i - 1][j] + score[Map[str1[i - 1]]][4];
sum2 = gene[i - 1][j - 1] + score[Map[str1[i - 1]]][Map[str2[j - 1]]];
sum3 = gene[i][j - 1] + score[4][Map[str2[j - 1]]];
gene[i][j] = max(sum1, max(sum2, sum3));
}
}
cout << gene[n][m] << endl;
}
}