题目大意:
匹配连个不同的DNA单链的相关度, 求相关度的值
大致思路:
由于不同的加入'-'符号的位置将会影响相关度,这里DFS搜索出当第一个串匹配到第 i 个字母 , 第二个穿匹配到了第 j 个字母时能得到的最大相关度 dp[ i ][ j ]那么记忆化一下即可。
算是一个历史遗留下来的题,现在看到做起来比较轻松了
代码如下:
Result : Accepted Memory : 316 KB Time : 0 ms
/* * Author: Gatevin * Created Time: 2014/8/14 19:11:34 * File Name: haha.cpp */ #include<iostream> #include<sstream> #include<fstream> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<cctype> #include<cmath> #include<ctime> #include<iomanip> using namespace std; const double eps(1e-8); typedef long long lint; const int inf = 0x7fffffff; int dp[101][101]; map<pair<char, char>, int> C; char s1[101]; char s2[101]; int len1, len2; void initial() { C[make_pair('A', 'A')] = 5; C[make_pair('C', 'C')] = 5; C[make_pair('G', 'G')] = 5; C[make_pair('T', 'T')] = 5; C[make_pair('A', 'C')] = C[make_pair('C', 'A')] = -1; C[make_pair('G', 'A')] = C[make_pair('A', 'G')] = -2; C[make_pair('A', 'T')] = C[make_pair('T', 'A')] = -1; C[make_pair('A', '-')] = C[make_pair('-', 'A')] = -3; C[make_pair('C', 'G')] = C[make_pair('G', 'C')] = -3; C[make_pair('C', 'T')] = C[make_pair('T', 'C')] = -2; C[make_pair('C', '-')] = C[make_pair('-', 'C')] = -4; C[make_pair('G', 'T')] = C[make_pair('T', 'G')] = -2; C[make_pair('G', '-')] = C[make_pair('-', 'G')] = -2; C[make_pair('T', '-')] = C[make_pair('-', 'T')] = -1; return; } int dfs(int x, int y) { if(x == len1 && y == len2) return 0; if(dp[x][y] != -inf) return dp[x][y]; if(x + 1 <= len1) dp[x][y] = max(dp[x][y], dfs(x + 1, y) + C[make_pair(s1[x], '-')]); if(y + 1 <= len2) dp[x][y] = max(dp[x][y], dfs(x, y + 1) + C[make_pair('-', s2[y])]); if(x + 1 <= len1 && y + 1 <= len2) dp[x][y] = max(dp[x][y] , dfs(x + 1, y + 1) + C[make_pair(s1[x], s2[y])]); return dp[x][y]; } int main() { initial(); int t; scanf("%d", &t); while(t--) { for(int i = 0; i <= 100; i++) { for(int j = 0; j <= 100; j++) { dp[i][j] = - inf; } } scanf("%d", &len1); getchar(); for(int i = 0; i < len1; i++) { scanf("%c", s1 + i); } scanf("%d", &len2); getchar(); for(int i = 0; i < len2; i++) { scanf("%c", s2 + i); } printf("%d\n", dfs(0, 0)); } return 0; }