题意:
给你两串字符串,然后让你找到这两个字符串的最小匹配。
做法:
dp问题。dp公式:map[i][j]=max3(map[i-1][j-1]+sale[xx][yy],map[i-1][j]+sale[xx][4],map[i][j-1]+sale[4][yy]);
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int sale[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,-100}};
int lenx[101];
int leny[101];
int m,n;
int get(char str)
{
switch(str)
{
case 'A':return 0;break;
case 'C':return 1;break;
case 'G':return 2;break;
case 'T':return 3;break;
case '-':return 4;break;
};
}
int map[101][101];
int max3(int a,int b,int c)
{
int d;
d=a;
int leap=1;
if(d<b)d=b,leap=2;
if(d<c)d=c,leap=3;
return d;
}
void chu()
{
int i,j;
memset(map,0,sizeof(map));
map[0][0]=0;
map[0][1]=sale[4][leny[0]];
map[1][0]=sale[lenx[0]][4];
for(i=1;i<=m;i++)
{
map[i][0]=map[i-1][0]+sale[lenx[i-1]][4];
}
for(i=1;i<=n;i++)
{
map[0][i]=map[0][i-1]+sale[4][leny[i-1]];
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(map[i][j]==0)
{
int xx=lenx[i-1];
int yy=leny[j-1];
map[i][j]=max3(map[i-1][j-1]+sale[xx][yy],map[i-1][j]+sale[xx][4],map[i][j-1]+sale[4][yy]);
}
}
}
printf("%d\n",map[m][n]);
}
int main()
{
int t,i;
char c;
scanf("%d%*c",&t);
while(t--)
{
scanf("%d%*c",&m);
for(i=0;i<m;i++)
{
scanf("%c",&c);
lenx[i]=get(c);
// printf("%d",lenx[i]);
}
// puts("");
scanf("%d%*c",&n);
for(i=0;i<n;i++)
{
scanf("%c",&c);
leny[i]=get(c);
// printf("%d",leny[i]);
}
// puts("");
chu();
}
}