zoj1027

来源:互联网 发布:linux驱动 编辑:程序博客网 时间:2024/06/14 16:08
 

解析思路:

状态转移方程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;}