现在的位置: 首页 > 综合 > 正文

POJ 1080 LCS扩展!

2013年10月08日 ⁄ 综合 ⁄ 共 1296字 ⁄ 字号 评论关闭

#include<cstdio>
#include<algorithm>

using namespace std;

#define A 0
#define C 1
#define G 2
#define T 3
#define MINUS 4

#define BUFSIZE 110

char p[BUFSIZE],q[BUFSIZE];

int rule[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}
};

int best[BUFSIZE][BUFSIZE];

int index(char a)
{
    switch(a){
        case 'A':  return A;
        case 'C':  return C;
        case 'G':  return G;
        case 'T':  return T;
        case '-':  return MINUS;
    }
}
int compute(char a,char b)
{
    int i = index(a);
    int j = index(b);
    return rule[i][j];
}
int mymax(int i,int j,int k)
{
    i = max(i,j);
    i = max(i,k);
    return i;
}
int main()
{
    int cases;
    scanf("%d",&cases);
    for(int i=0;i<cases;i++){
        int m,n;
        scanf("%d",&m);
        for(int j=0;j<=m+1;j++)p[j] = getchar();
        scanf("%d",&n);
        for(int j=0;j<=n+1;j++)q[j] = getchar();
        p[0]='-',q[0]='-';
        int sum = 0;
        best[0][0] = 0;
        for(int j=1;j<=n;j++)best[j][0] = best[j-1][0]+compute(p[j],'-');
        for(int j=1;j<=n;j++)best[0][j] = best[0][j-1]+compute(q[j],'-');
        //注意边界条件的计算。
        for(int j=1;j<=m;j++)
            for(int k=1;k<=n;k++)
                best[j][k] = mymax(best[j-1][k]+compute(p[j],'-'),
                                    best[j][k-1]+compute(q[k],'-'),
                                    best[j-1][k-1]+compute(p[j],q[k]));
           
        printf("%d/n",best[m][n]);
    }
    return 0;
}

 

抱歉!评论已关闭.