码迷,mamicode.com
首页 > 其他好文 > 详细

dp1080

时间:2014-08-13 12:48:16      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   strong   for   ar   div   

题目大意:给出两个字符串,要使他们对齐,比如: AGTGATG GTTAG 这两个字符串可以看成是

AGTGATG

-GTTA-G 也可以看成是

AGTGAT

-G-GT--TAG 然后每个对齐的字母去查表可以得到他们的值 问怎么对齐可以得到所有值的和的最大值

LCS的变形而已

注意LCS的子串可以是离散的,不必连续,用动态规划

c[i][j]=max( c[i-1][j-1]+value(a[i],b[j]), c[i][j-1]+value(-,b[j]), c[i-1][j]+value(a[i],-) )
这里的I,J表示前面I,J的各个可能的匹配情况

#include<cstdio>
#include<cstring>

int cmpmax(int a,int b)
{
    int c=a>b?a:b;
    return c;
}

int match1(char a,char b)
{
    if(a==A)
    {
        if(b==A)
            return 5;
        if(b==C)
            return -1;

        if(b==G)
            return -2;    
        
        if(b==T)
            return -1;

        if(b==-)
            return -3;    
    }
    
    if(a==C)
    {
        if(b==A)
            return -1;
        if(b==C)
            return 5;

        if(b==G)
            return -3;    
        
        if(b==T)
            return -2;

        if(b==-)
            return -4;    
    }
    

    if(a==G)
    {
        if(b==A)
            return -2;
        if(b==C)
            return -3;

        if(b==G)
            return 5;    
        
        if(b==T)
            return -2;

        if(b==-)
            return -2;    
    }


    if(a==T)
    {
        if(b==A)
            return -1;
        if(b==C)
            return -2;

        if(b==G)
            return -2;    
        
        if(b==T)
            return 5;

        if(b==-)
            return -1;    
    }


    
    if(a==-)
    {
        if(b==A)
            return -3;
        if(b==C)
            return -4;

        if(b==G)
            return -2;    
        
        if(b==T)
            return -1;
    }
}


int match2(char a)
{
    if(a==A)
        return -3;

    if(a==C)
        return -4;

    if(a==G)
        return -2;

    if(a==T)
        return -1;
}

int main()
{
    int l1,l2,i,j,num,s1,s2;
    char a[103],b[103];
    int s[103][103];
    scanf("%d",&num);
    while(num--)
    {
        scanf("%d",&l1);

        scanf("%c",&a[1]);
        for(i=1;i<=l1;i++)
        scanf("%c",&a[i]);

        scanf("%d",&l2);
        scanf("%c",&b[1]);
        for(i=1;i<=l2;i++)
        scanf("%c",&b[i]);


        memset(s,0,sizeof(s));

        s[0][0]=0;
        int temp;
        
        for(i=1;i<=l1;i++)
            s[i][0]=s[i-1][0]+match2(a[i]);
//之前的代码是s[i][0]=match2(a[i]);一直不对,因为没有考虑前面i-1的字符匹配结果

        for(i=1;i<=l2;i++)
            s[0][i]=s[0][i-1]+match2(b[i]);

        for(i=1;i<=l1;i++)
            for(j=1;j<=l2;j++)
            {
                if(a[i]==b[j])//相等时匹配值为5
                    s[i][j]=s[i-1][j-1]+5;
                else
                {
                    s1=match2(a[i]);
                    s2=match2(b[j]);
                       temp=cmpmax(s[i-1][j]+s1,s[i][j-1]+s2);
                    s[i][j]=cmpmax(temp,s[i-1][j-1]+match1(a[i],b[j]));
                }
            }
        printf("%d\n",s[l1][l2]);
    }
    return 1;
}

 

dp1080,布布扣,bubuko.com

dp1080

标签:style   blog   color   io   strong   for   ar   div   

原文地址:http://www.cnblogs.com/notlate/p/3909664.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!