方程挺好想的,就是本题的初始化我弄了挺久
不是忘了这个就是那个
#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> using namespace std; int n1,n2; const int N=103; char s1[N],s2[N]; int d1[N],d2[N]; const int tab[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 f[N][N]; int main() { scanf("%d%s",&n1,s1+1); scanf("%d%s",&n2,s2+1); for(int i=1;i<=n1;i++) { if(s1[i]=='A') d1[i]=0; else if(s1[i]=='C') d1[i]=1; else if(s1[i]=='G') d1[i]=2; else if(s1[i]=='T') d1[i]=3; } for(int i=1;i<=n2;i++) { if(s2[i]=='A') d2[i]=0; else if(s2[i]=='C') d2[i]=1; else if(s2[i]=='G') d2[i]=2; else if(s2[i]=='T') d2[i]=3; } memset(f,-0x3f,sizeof(f)); f[0][0]=0;for(int i=1;i<=n2;i++) f[0][i]=f[0][i-1]+tab[d2[i]][4]; for(int i=1;i<=n1;i++) f[i][0]=f[i-1][0]+tab[d1[i]][4]; for(int i=1;i<=n1;i++) for(int j=1;j<=n2;j++) { f[i][j]=max(f[i-1][j-1]+tab[d1[i]][d2[j]], max(f[i-1][j]+tab[d1[i]][4], f[i][j-1]+tab[d2[j]][4]) ); //printf("%d %d %d\n",f[i-1][j-1]+tab[d1[i]][d2[j]],f[i-1][j]+tab[d1[i]][4],f[i][j-1]+tab[d2[j]][4]); //printf("%d\n",f[i][j]); } printf("%d\n",f[n1][n2]); return 0; }