大意:每两个字母都对应着一个相应的值,现在通过对短的字符串添加‘-’来求可以得到的最大值。
注意初始化dp[0][i],dp[i][0]就OK了
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int zhuanhuan(char a,char b)
{
if(a==b)
return 5;
else if(a=='C'&&b=='A'||a=='A'&&b=='C'||a=='T'&&b=='A'||a=='A'&&b=='T'||a=='-'&&b=='T'||a=='T'&&b=='-')
return -1;
else if(a=='A'&&b=='G'||a=='G'&&b=='A'||a=='C'&&b=='T'||a=='T'&&b=='C'||a=='G'&&b=='T'||a=='T'&&b=='G'||a=='G'&&b=='-'||a=='-'&&b=='G')
return -2;
else if(a=='A'&&b=='-'||a=='-'&&b=='A'||a=='C'&&b=='G'||a=='G'&&b=='C')
return -3;
else if(a=='C'&&b=='-'||a=='-'&&b=='C')
return -4;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
char s1[101],s2[101];
scanf("%d%s%d%s",&n,s1,&m,s2);
int dp[101][101];
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
{
dp[0][i]=dp[0][i-1]+zhuanhuan('-',s2[i-1]);
}
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0]+zhuanhuan(s1[i-1],'-');
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]=max(max(dp[i-1][j]+zhuanhuan(s1[i-1],'-'),dp[i][j-1]+zhuanhuan('-',s2[j-1])),dp[i-1][j-1]+zhuanhuan(s1[i-1],s2[j-1]));
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}