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;
}

 

 

posted @ 2012-04-07 23:32  BeatLJ  阅读(135)  评论(0编辑  收藏  举报