LCS问题的变形,没什么说的。
#include <iostream>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
int f[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 getc(char a)
{
if(a=='A')
return 0;
if(a=='C')
return 1;
if(a=='G')
return 2;
return 3;
}
int main()
{
int n,t1,t2;
char a;
cin>>n;
int s1[111],s2[111],ans[111][111];
while(n--)
{
ans[0][0]=0;
cin>>t1;
for(int i=1; i<=t1; i++)
{
cin>>a;
s1[i]=getc(a);
}
cin>>t2;
for(int i=1; i<=t2; i++)
{
cin>>a;
s2[i]=getc(a);
ans[0][i]=ans[0][i-1]+f[s2[i]][4];
}
for(int i=1; i<=t1; i++)
{
ans[i][0]=ans[i-1][0]+f[s1[i]][4];
for(int j=1; j<=t2; j++)
{
ans[i][j]=max(max(ans[i-1][j-1]+f[s1[i]][s2[j]],ans[i-1][j]+f[s1[i]][4]),ans[i][j-1]+f[4][s2[j]]);
}
}
cout<<ans[t1][t2]<<endl;
}
return 0;
}