题目描述:
求基因组配对的最大的分
解题思路:
动态规划。类似编辑距离或者公共子串的思路。第[i][j] 的配对取决于矩阵的左上角三个数。
代码:
#include <stdio.h>
#define N 102
#define _MAX(a,b,c)(a>b?(a>c?a:c):(b>c?b:c))
int n, m, dp[N][N];
char str1[N], str2[N];
int _str1[N], _str2[N];
int map[5][5] = {{-100,-3,-4,-2,-1},
{-3,5,-1,-2,-1},
{-4,-1,5,-3,-2},
{-2,-2,-3,5,-2},
{-1,-1,-2,-2,5}};
void s_to_i(char* str, int* str_i){
int i=1;
while(*str!='\0'){
switch(*str){
case 'A':
str_i[i] = 1;
break;
case 'C':
str_i[i] = 2;
break;
case 'G':
str_i[i] = 3;
break;
case 'T':
str_i[i] = 4;
break;
default:
break;
}
i++;
str++;
}
}
main(){
int t, i, j;
scanf("%d",&t);
while(t){
t--;
scanf("%d %s",&n, str1);
scanf("%d %s",&m, str2);
s_to_i(str1, _str1);
s_to_i(str2, _str2);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
dp[i][0] = map[0][_str1[i]] + dp[i-1][0];
for(i=1;i<=m;i++)
dp[0][i] = map[0][_str2[i]] + dp[0][i-1];
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
dp[i][j] = _MAX(dp[i-1][j] + map[0][_str1[i]],
dp[i][j-1] + map[0][_str2[j]],
dp[i-1][j-1] + map[_str1[i]][_str2[j]]);
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}