dp黑洞再次凭一己之力写对了一道dp水题,这个题很简单,跟最长公共子序列一样。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;
int t,f[105][105],len1,len2;
char s1[105],s2[105];
int get(char ch)
{
if (ch=='A') return 1;
if (ch=='C') return 2;
if (ch=='G') return 3;
if (ch=='T') return 4;
return 5;
}
int find(char a,char b)
{
int x=get(a);
int y=get(b);
if (x==y) return 5;
else if (x*y==2 || x*y==4 || x*y==20) return -1;
else if (x*y==3 || x*y==8 || x*y==12 || x*y==15) return -2;
else if (x*y==5 || x*y==6) return -3;
else if (x*y==10) return -4;
}
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d",&len1);
for (int i=1; i<=len1; i++)
{
cin>>s1[i];
}
scanf("%d",&len2);
for (int i=1; i<=len2; i++)
{
cin>>s2[i];
}
memset(f,0,sizeof(f));
for (int i=1; i<=len1; i++)
{
f[i][0]=f[i-1][0]+find('-',s1[i]);
}
for (int i=1; i<=len2; i++)
{
f[0][i]=f[0][i-1]+find('-',s2[i]);
}
for (int i=1; i<=len1; i++)
{
for (int j=1; j<=len2; j++)
{
f[i][j]=max(f[i-1][j]+find(s1[i],'-'),f[i][j-1]+find(s2[j],'-'));
f[i][j]=max(f[i][j],f[i-1][j-1]+find(s1[i],s2[j]));
//cout<<"i="<<i<<" j="<<j<<endl;
//cout<<"f1="<<f[i-1][j]+find(s1[i],'-')<<" f2="<<f[i][j-1]+find(s2[j],'-')<<" f3="<<f[i-1][j-1]+find(s1[i],s2[j])<<endl;
}
}
printf("%d\n",f[len1][len2]);
}
return 0;
}