题目大意
- 知道两个字符串,对应DNA中的碱基,并且四种碱基之间对应有一个得分表;
- 求最大的匹配得分。
思路1
- 他写得非常完美
代码:
//luogu1140:相似基因
#include<bits/stdc++.h>
using namespace std;
int na,nb,a[110],b[110],f[110][110];
char s[110];
int p[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 ch(char c)//字母变参数
{
if(c=='A') return 0; if(c=='C') return 1;
if(c=='G') return 2; return 3;
}
void pre()//读入与初始化
{
scanf("%d %s",&na,s+1); for(int i=1;i<=na;i++) a[i]=ch(s[i]);
scanf("%d %s",&nb,s+1); for(int i=1;i<=nb;i++) b[i]=ch(s[i]);
for(int i=0;i<=na;i++) for(int j=0;j<=nb;j++) f[i][j]=-999999999;
f[0][0]=0;
for(int i=1;i<=na;i++) f[i][0]=f[i-1][0]+p[a[i]][4];
for(int i=1;i<=nb;i++) f[0][i]=f[0][i-1]+p[b[i]][4];
}
int main()
{
pre();
for(int i=1;i<=na;i++)
{
for(int j=1;j<=nb;j++)
{
f[i][j]=max(f[i][j],f[i][j-1]+p[b[j]][4]);
f[i][j]=max(f[i][j],f[i-1][j]+p[a[i]][4]);
f[i][j]=max(f[i][j],f[i-1][j-1]+p[a[i]][b[j]]);
}
}
printf("%d",f[na][nb]);
return 0;
}