POJ1080(Human Gene Functions)
动态规划题,LCS的变形。无语了,写错两个字母,WA了3次啊!
#include <stdio.h>
#include <string.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define N 105
int m[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,-10000
};
char a[N],b[N],vis[N][N],la,lb;
int c[N][N];
int f(int x,int y)
{
int i,tmp,max;
if(x==0)
{
for(i=0,tmp=0;i<y;i++) tmp+=m[b[i]][4]; //此处的i写成了y
return c[x][y]=tmp;
}
if(y==0)
{
for(i=0,tmp=0;i<x;i++) tmp+=m[a[i]][4]; //此处的i写成了x
return c[x][y]=tmp;
}
if(vis[x][y]) return c[x][y];
max=m[a[x-1]][b[y-1]]+f(x-1,y-1);
max=MAX(max,m[a[x-1]][4]+f(x-1,y));
max=MAX(max,m[b[y-1]][4]+f(x,y-1));
vis[x][y]=1;
return c[x][y]=max;
}
int main()
{
int t,i,n;
scanf("%d",&t);
while(t--)
{
scanf("%d%s",&la,a);
for(i=0;i<la;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;break;
default: a[i]=4;break;
}
}
scanf("%d%s",&lb,b);
for(i=0;i<lb;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;break;
default: b[i]=4;break;
}
}
memset(vis,0,sizeof(vis));
printf("%d\n",f(la,lb));
}
return 0;
}

浙公网安备 33010602011771号