题目大意:
匹配连个不同的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;
}