zoj1027

 

解析思路:

状态转移方程b[i][j]=max(b[i-1][j-1]+t[i][j],b[i][j-1]+t[4][j],b[i-1][j]+t[i][4]);i表示第一个字符串位子,j表示第二个字符串的位子;b[i][j]表示1到i,1到j位子的值

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int t[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 max(int a,int b,int c)
{
  int temp;
  temp=a>b?a:b;
  return temp=c>temp?c:temp;
}
int main()
{
  int n;
  scanf("%d",&n);
  while(n--)
  {
    int i,j,k,m,temp1[200],temp2[200];
    char s[2][200];
    for(j=0;j<2;j++) scanf("%d %s",&m,s[j]);
    for(k=1;k<=strlen(s[0]);k++)
    {
      if(s[0][k-1]=='A') temp1[k]=0;
      else if(s[0][k-1]=='C') temp1[k]=1;
      else if(s[0][k-1]=='G') temp1[k]=2;
      else if(s[0][k-1]=='T') temp1[k]=3;
    }
    for(k=1;k<=strlen(s[1]);k++)
    {
      if(s[1][k-1]=='A') temp2[k]=0;
      else if(s[1][k-1]=='C')  temp2[k]=1;
      else if(s[1][k-1]=='G')  temp2[k]=2;
      else if(s[1][k-1]=='T')  temp2[k]=3;
    }
    int p,q,best[200][200];
    best[0][0]=0;
    for(j=1;j<=strlen(s[0]);j++)
      best[j][0]=best[j-1][0]+t[temp1[j]][4];
    for(j=1;j<=strlen(s[1]);j++)
      best[0][j]=best[0][j-1]+t[4][temp2[j]];
    for(p=1;p<=strlen(s[0]);p++)
    {
      for(q=1;q<=strlen(s[1]);q++)
      {
        best[p][q]=max(t[temp1[p]][temp2[q]]+best[p-1][q-1],
        best[p-1][q]+t[temp1[p]][4],best[p][q-1]+t[4][temp2[q]]);  
      }
    }
    printf("%d\n",best[p-1][q-1]);
  }
  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值