poj1080 2010.2.20
#include <stdio.h>
#define N 103
int max(int a,int b,int c)
{
int d=a>b?a:b;
return d>c?d:c;
}
void main()
{
char a[N],b[N];
int m,n,i,j,num,c[N][N]={0};
int d[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
};
scanf("%d",&num);
while (num--)
{
scanf("%d",&m);
scanf("%s",a+1);
scanf("%d",&n);
scanf("%s",b+1);
for (i=1;i<=m;i++)
{
switch (a[i])
{
case 'A':a[i]=0;break;
case 'C':a[i]=1;break;
case 'G':a[i]=2;break;
case 'T':a[i]=3;
}
}
for (i=1;i<=n;i++)
{
switch (b[i])
{
case 'A':b[i]=0;break;
case 'C':b[i]=1;break;
case 'G':b[i]=2;break;
case 'T':b[i]=3;
}
}
c[0][0]=0;
for (i=1;i<=m;i++)
{
c[i][0]=c[i-1][0]+d[a[i]][4];
}
for (i=1;i<=n;i++)
{
c[0][i]=c[0][i-1]+d[4][b[i]];
}
for (i=1;i<=m;i++)
{
for (j=1;j<=n;j++)
{
if (a[i]==b[j])
{
c[i][j]=c[i-1][j-1]+5;
}
else
{
c[i][j]=max(c[i-1][j-1]+d[a[i]][b[j]],c[i-1][j]+d[a[i]][4],c[i][j-1]+d[4][b[j]]);
}
}
}
printf("%d\n",c[m][n]);
}
}