题意:求解两个字符串的最大匹配分数,递推res[i][j],即第一个字符串的前i个字符和第二个字符串的前j个字符匹配的最大分数即可。
#include <iostream>
using namespace std;
int T;
int m,n;
int score[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 a[100];
int b[100];
int res[100][100];
int char2index(char c)
{
if(c=='A') return 0;
if(c=='C') return 1;
if(c=='G') return 2;
return 3;
}
int MAX(int a,int b)
{
return a>b?a:b;
}
int main()
{
cin>>T;
char c;
while(T--)
{
cin>>m;
for(int i=0;i<m;i++)
{
cin>>c;
a[i]=char2index(c);
}
cin>>n;
for(int i=0;i<n;i++)
{
cin>>c;
b[i]=char2index(c);
}
res[0][0]=score[a[0]][b[0]];
int sum=0,tmax=-10,tidx;
for(int j=0;j<n;j++)
{
sum+=score[b[j]][4];
if(tmax<score[a[0]][b[j]])
{
tmax=score[a[0]][b[j]];
tidx=j;
}
res[0][j]=sum-score[b[tidx]][4]+tmax;
}
sum=0;tmax=-10;tidx=0;
for(int i=0;i<m;i++)
{
sum+=score[a[i]][4];
if(tmax<score[b[0]][a[i]])
{
tmax=score[b[0]][a[i]];
tidx=i;
}
res[i][0]=sum-score[a[tidx]][4]+tmax;
}
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
{
res[i][j]=-1000;
res[i][j]=MAX(res[i][j],res[i][j-1]+score[b[j]][4]);
res[i][j]=MAX(res[i][j],res[i-1][j]+score[a[i]][4]);
res[i][j]=MAX(res[i][j],res[i-1][j-1]+score[a[i]][b[j]]);
}
cout<<res[m-1][n-1]<<endl;
}
return 0;
}