转移方程还是很好想的,很明显dp[i][j]=max(dp[i][j],dp[i-1][j]+A链与空匹配,dp[i][j-1]+B链与空匹配,dp[i][j]+AB链同时匹配
但是要注意细节,代码一定要写好,我就是打错奇怪的地方调了好久
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;//A->0 C->1 G->2 T->3 -->4
int zh[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 turn(char c)
{
switch (c)
{
case 'A':return 0;break;
case 'C':return 1;break;
case 'G':return 2;break;
case 'T':return 3;break;
}
return 4;
}
int dp[200][200];
int main()
{
int a,b;
string s1,s2;
cin>>a;
cin>>s1;
cin>>b;
cin>>s2;
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
dp[i][j]=-0x3f;
for(int i=1;i<=a;i++)
dp[i][0]=dp[i-1][0]+zh[turn(s1[i-1])][4];
for(int i=1;i<=b;i++)
dp[0][i]=dp[0][i-1]+zh[4][turn(s2[i-1])];
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
{
dp[i][j]=max(max(dp[i][j],dp[i-1][j]+zh[turn(s1[i-1])][4]),
max(dp[i][j-1]+zh[4][turn(s2[j-1])],dp[i-1][j-1]+zh[turn(s1[i-1])][turn(s2[j-1])]));
}
printf("%d",dp[a][b]);
}