poj1080

#include    <iostream>
#include    <cstring>
#include    <cstdio>
using namespace std;

#define SIZE 102

int N;
int cases;

int n1,n2;
char gene1[SIZE];
char gene2[SIZE];
int result = 0;
int dp[SIZE][SIZE];

const int table[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 mapto(char m)
{
    switch(m){
        case 'A':return 0;
        case 'C':return 1;
        case 'G':return 2;
        case 'T':return 3;
        case '-':return 4;
    }
    return 0;
}
int match(char m1, char m2)
{
    int score = 0;
    int p1,p2;
    p1 = mapto(m1);    
    p2 = mapto(m2);    

    score = table[p1][p2];

    return score;
}


void Input ()
{
    scanf("%d",&n1);
    

    for(int i=1;i<=n1;i++){
        scanf("%c",&gene1[i]);
        while(gene1[i]==10||gene1[i]==13||gene1[i]==' '){
            scanf("%c",&gene1[i]);
        }
    }
    scanf("%d",&n2);
    for(int i=1;i<=n2;i++){
        scanf("%c",&gene2[i]);
        while(gene2[i]==10||gene2[i]==13||gene2[i]==' '){
            scanf("%c",&gene2[i]);
        }
    }


}        /* -----  end of function Input  ----- */

void Solve ()
{
    memset(dp,0,sizeof(dp));    
    

    for(int i=1;i<=n1;i++){
        dp[i][0] = dp[i-1][0] + match(gene1[i],'-');
    }
    for(int i=1;i<=n2;i++){
        dp[0][i] = dp[0][i-1] + match(gene2[i],'-');
    }

    for(int i=1;i<=n1;i++){
        for(int j=1;j<=n2;j++){
            dp[i][j] = dp[i-1][j-1] + match(gene1[i],gene2[j]);
            int stmp = dp[i-1][j]+match(gene1[i],'-');
        
            if(stmp > dp[i][j]){
                dp[i][j] = stmp;
            }

            stmp = dp[i][j-1]+match(gene2[j],'-');

            if(stmp > dp[i][j]){
                dp[i][j] = stmp;
                //cout<<dp[i][j]<<endl;
            }

        }
    }
    result = dp[n1][n2];    
}        /* -----  end of function Solve  ----- */

void Output ()
{
    printf("%d\n",result);

}        /* -----  end of function Output  ----- */

int main ()
{
    int K;
    scanf("%d",&K);
    for(cases=1;cases<=K;cases++){
        Input();
        Solve();
        Output();
    }

    return 0;
}        /* ----------  end of function main  ---------- */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值