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;

}

 

 

你可能感兴趣的:(functions)