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

hdu 1080 Human Gene Functions(DP)

时间:2015-01-25 12:19:53      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

题意:

人类基因由A、C、G、T组成。

有一张5*5的基因表。每格有一个值,叫相似度。例:A-C:-3。意思是如果A和C配对, 则它俩的相似度是-3【P.S.:-和-没有相似度,即-和-不能配对】

现在给两条基因片段。(长度不一定相等)

现在你要在两条基因片段中插入若干个-(空白基因),使得两个基因片段长度相等,且得到的整体相似度的值最大。【再次P.S.:-和-不能配对】

 

思路:

因为-和-不能匹配,所以插入的-的个数是有限的。

str1的第一个基因可以与str1的第一个或-配对。然后,,,,很快就看到了DP结构,,,

和最长公共子串一样滴的意思,,,

DP方程:dp[i][j]:str1的前i个和str2的前j个能获得的最大相似度值。

看代码,,

 

代码:

int l1,l2;
char s1[105], s2[105];
int S1[105], S2[105];
int a[6][6]={{5,-1,-2,-1,-3},{-1,5,-3,-2,-4},{-2,-3,5,-2,-2},{-1,-2,-2,5,-1},{-3,-4,-2,-1,inf}};
int dp[105][105];


int maxx(int a,int b,int c){
    int t=max(a,b);
    return max(t,c);
}


int main(){

    int T;
    cin>>T;
    while(T--){
        scanf("%d",&l1);
        scanf("%s",s1);
        scanf("%d",&l2);
        scanf("%s",s2);
        rep(i,0,l1-1){
            if(s1[i]==A) S1[i]=0;
            else if(s1[i]==C) S1[i]=1;
            else if(s1[i]==G) S1[i]=2;
            else S1[i]=3;
        }
        rep(i,0,l2-1){
            if(s2[i]==A) S2[i]=0;
            else if(s2[i]==C) S2[i]=1;
            else if(s2[i]==G) S2[i]=2;
            else S2[i]=3;
        }

        dp[0][0]=0;
        rep(i,0,l2-1){
            dp[0][i+1]=dp[0][i]+a[4][S2[i]];
        }
        rep(i,0,l1-1){
            dp[i+1][0]=dp[i][0]+a[S1[i]][4];
        }
        rep(i,1,l1){
            rep(j,1,l2){
                dp[i][j]=maxx( dp[i-1][j-1]+a[S1[i-1]][S2[j-1]],dp[i-1][j]+a[S1[i-1]][4],dp[i][j-1]+a[4][S2[j-1]] );
            }
        }
        printf("%d\n",dp[l1][l2]);
    }

    return 0;
}

 

hdu 1080 Human Gene Functions(DP)

标签:

原文地址:http://www.cnblogs.com/fish7/p/4248001.html

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