#include<cstdio>
#include<algorithm>
using namespace std;
#define A 0
#define C 1
#define G 2
#define T 3
#define MINUS 4
#define BUFSIZE 110
char p[BUFSIZE],q[BUFSIZE];
int rule[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 best[BUFSIZE][BUFSIZE];
int index(char a)
{
switch(a){
case 'A': return A;
case 'C': return C;
case 'G': return G;
case 'T': return T;
case '-': return MINUS;
}
}
int compute(char a,char b)
{
int i = index(a);
int j = index(b);
return rule[i][j];
}
int mymax(int i,int j,int k)
{
i = max(i,j);
i = max(i,k);
return i;
}
int main()
{
int cases;
scanf("%d",&cases);
for(int i=0;i<cases;i++){
int m,n;
scanf("%d",&m);
for(int j=0;j<=m+1;j++)p[j] = getchar();
scanf("%d",&n);
for(int j=0;j<=n+1;j++)q[j] = getchar();
p[0]='-',q[0]='-';
int sum = 0;
best[0][0] = 0;
for(int j=1;j<=n;j++)best[j][0] = best[j-1][0]+compute(p[j],'-');
for(int j=1;j<=n;j++)best[0][j] = best[0][j-1]+compute(q[j],'-');
//注意边界条件的计算。
for(int j=1;j<=m;j++)
for(int k=1;k<=n;k++)
best[j][k] = mymax(best[j-1][k]+compute(p[j],'-'),
best[j][k-1]+compute(q[k],'-'),
best[j-1][k-1]+compute(p[j],q[k]));
printf("%d/n",best[m][n]);
}
return 0;
}
POJ 1080 LCS扩展!
最新推荐文章于 2017-08-19 11:53:20 发布