动态规划题,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; }