PKU1080--Human Gene Functions(基因相似度,动态规划)

328K0MSGCC983B2009-01-09 08:57:52

对字符串的最后一位分析,分三种情况:(第一个字符串有n位,第二个字符串有m位)

1)n位和m位匹配+前面子串的最优值(第一个基因的前n-1位,第二个基因的前m位)

2)第一个基因的最后一位(即n位)与‘-’匹配+前面子串的最优值(第一个基因的前n-1位,第二个基因的前m位)

3)第二个基因的最后一位(即m位)与‘-’匹配+前面子串的最优值(第一个基因的前n位,第二个基因的前m-1位)

核心代码:

best[i][j]=max(best[i-1][j-1]+table[atod(a[i])][atod(b[j])],best[i-1][j]+table[atod(a[i])][4],best[i][j-1]+table[4][atod(b[j])]);

初始化工作:

for(i=1;i<=lena;i++)
  best[i][0]=best[i-1][0]+table[atod(a[i])][4];
 for(i=1;i<=lenb;i++)
  best[0][i]=best[0][i-1]+table[4][atod(b[i])];

其中table记录的是题目所给的基因函数的表格。

代码如下:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
#include<stdio.h>
#define max(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
char a[105],b[105];
int best[105][105],lena,lenb;
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}};
char temp[5]={'A','C','G','T','-'};
int atod(char c)
{
    
int i;
    
for(i=0;i<5;i++){
        
if(temp[i]==c)
            
return i;
    }
    
return -1;
}
void input()
{
    scanf(
"%d %s",&lena,&a[1]);
    scanf(
"%d %s",&lenb,&b[1]);
}
void process()
{
    
int i,j;
    best[
0][0]=0;
    
for(i=1;i<=lena;i++)
        best[i][
0]=best[i-1][0]+table[atod(a[i])][4];
    
for(i=1;i<=lenb;i++)
        best[
0][i]=best[0][i-1]+table[4][atod(b[i])];
    
for(i=1;i<=lena;i++)
        
for(j=1;j<=lenb;j++)
            best[i][j]
=max(best[i-1][j-1]+table[atod(a[i])][atod(b[j])],best[i-1][j]+table[atod(a[i])][4],best[i][j-1]+table[4][atod(b[j])]);
    printf(
"%d\n",best[lena][lenb]);
}
int main()
{
    
int caseno;
    scanf(
"%d",&caseno);
    
while(caseno--){
        input();
        process();
    }
    
return 0;
}

转载于:https://www.cnblogs.com/pandy/archive/2009/01/09/1372279.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值